原文请参考微信公众账号(包含图文):https://mp.weixin.qq.com/s/o2AGrNd8rZHp9DbDppjI2Q
Netty数据传输
Netty数据传输流程:客户端发送数据(出站)时,将消息流存放到缓冲区(ByteBuf),然后将ByteBuf数据传递给ChannelPipeline中的第一个ChannelOutBoundHandler,然后再传递给第二个ChannelOutBoundHandler,如果ChannelPipeline绑定有多个ChannelOutBoundHandler,则需要一层层传递下去,其中可以在ChannelOutBoundHandler中进行编码(Encoder)操作,接着会将ByteBuf数据从ChannelOutBoundHandler传递给ChannelInBoundHandler,如果ChannelPipeline绑定有多个ChannelInBoundHandler,则需一层层传递下去,可在ChannelInBoundHandler中进行解码(Decoder)操作,然后服务端收到消息(入站)后,将消息进行解码Decoder操作;两个BoundHandler之间的数据传递是通过ChannelHandlerContext来实现;
Netty实现聊天功能
ChatServerHandler
-
publicclassChatServerHandlerextendsSimpleChannelInboundHandler<String>{
-
-
privatefinalChannelGroup group;
-
-
publicChatServerHandler(ChannelGroup group){
-
this.group = group;
-
}
-
-
/**
-
* 将新加入的连接放入group中
-
* @param ctx
-
* @throws Exception
-
*/
-
@Override
-
publicvoid handlerAdded(ChannelHandlerContext ctx)throwsException{
-
group.add(ctx.channel());
-
}
-
-
/**
-
* 删除group中下线的连接
-
* @param ctx
-
* @throws Exception
-
*/
-
@Override
-
publicvoid handlerRemoved(ChannelHandlerContext ctx)throwsException{
-
group.remove(ctx.channel());
-
}
-
-
-
@Override
-
protectedvoid channelRead0(ChannelHandlerContext ctx,String msg)throwsException{
-
if(StringUtils.isEmpty(msg)){
-
return;
-
}
-
Channel incoming = ctx.channel();
-
for(Channel channel : group){
-
if(channel != incoming){
-
channel.writeAndFlush(msg +"\n");
-
}else{
-
channel.writeAndFlush(msg +"\n");
-
}
-
}
-
}
-
}
服务端引导类ChatServer
-
publicclassChatServer{
-
-
//创建 DefaultChannelGroup 用来 保存所有连接的的 WebSocket channel
-
privatefinalChannelGroup channelGroup =newDefaultChannelGroup(GlobalEventExecutor.INSTANCE);
-
-
publicvoid start(int port){
-
EventLoopGroup bossGroup =newNioEventLoopGroup();
-
EventLoopGroup workerGroup =newNioEventLoopGroup();
-
-
try{
-
ServerBootstrap bootstrap =newServerBootstrap();
-
bootstrap.group(bossGroup, workerGroup)
-
.channel(NioServerSocketChannel.class)
-
.childHandler(newChannelInitializer<SocketChannel>(){
-
@Override
-
protectedvoid initChannel(SocketChannel ch)throwsException{
-
ChannelPipeline pipeline = ch.pipeline();
-
pipeline.addLast("framer",newDelimiterBasedFrameDecoder(8192,Delimiters.lineDelimiter()));
-
pipeline.addLast("decoder",newStringDecoder());
-
pipeline.addLast("encoder",newStringEncoder());
-
pipeline.addLast(newChatServerHandler(channelGroup));
-
}
-
})
-
.option(ChannelOption.SO_BACKLOG,128)
-
.childOption(ChannelOption.SO_KEEPALIVE,true);
-
ChannelFuture future = bootstrap.bind(port).sync();
-
future.channel().closeFuture().sync();
-
}catch(Exception e){
-
e.printStackTrace();
-
}finally{
-
bossGroup.shutdownGracefully();
-
workerGroup.shutdownGracefully();
-
}
-
}
-
-
publicstaticvoid main(String[] args){
-
newChatServer().start(8080);
-
}
-
-
}
客户端ChatClientHandler
-
publicclassChatClientHandlerextendsSimpleChannelInboundHandler<String>{
-
/** 控制台不打印没有的信息 */
-
@Override
-
protectedvoid channelRead0(ChannelHandlerContext ctx,String msg)throwsException{
-
if(!msg.contains("HTTP/1.1")&&!msg.contains("Host:")&&!msg.contains("Proxy-Connection: keep-alive")&&!msg.contains("User-Agent:")){
-
System.out.println(msg);
-
}
-
}
-
}
客户端引导类ChatClientA
-
publicclassChatClientA{
-
-
publicstaticvoid main(String[] args){
-
newChatClientA().start();
-
}
-
-
-
publicvoid start(){
-
EventLoopGroup group =newNioEventLoopGroup();
-
try{
-
Bootstrap bootstrap =newBootstrap();
-
bootstrap.group(group)
-
.channel(NioSocketChannel.class)
-
.handler(newChannelInitializer<SocketChannel>(){
-
@Override
-
protectedvoid initChannel(SocketChannel ch)throwsException{
-
ch.pipeline().addLast("framer",newDelimiterBasedFrameDecoder(8192,Delimiters.lineDelimiter()));
-
ch.pipeline().addLast("decoder",newStringDecoder());
-
ch.pipeline().addLast("encoder",newStringEncoder());
-
ch.pipeline().addLast("handler",newChatClientHandler());
-
-
}
-
});
-
ChannelFuture future = bootstrap.connect("localhost",8080).sync();
-
Channel channel = future.channel();
-
BufferedReader in =newBufferedReader(newInputStreamReader(System.in));
-
while(true){
-
channel.writeAndFlush("ChatClientA说:"+ in.readLine()+"\r\n");
-
}
-
}catch(Exception e){
-
e.printStackTrace();
-
}finally{
-
group.shutdownGracefully();
-
}
-
-
}
-
-
}
客户端引导类ChatClientB
-
publicclassChatClientB{
-
-
publicstaticvoid main(String[] args){
-
newChatClientB().start();
-
}
-
-
publicvoid start(){
-
EventLoopGroup group =newNioEventLoopGroup();
-
try{
-
Bootstrap bootstrap =newBootstrap();
-
bootstrap.group(group)
-
.channel(NioSocketChannel.class)
-
.handler(newChannelInitializer<SocketChannel>(){
-
@Override
-
protectedvoid initChannel(SocketChannel ch)throwsException{
-
ch.pipeline().addLast("framer",newDelimiterBasedFrameDecoder(8192,Delimiters.lineDelimiter()));
-
ch.pipeline().addLast("decoder",newStringDecoder());
-
ch.pipeline().addLast("encoder",newStringEncoder());
-
ch.pipeline().addLast("handler",newChatClientHandler());
-
-
}
-
});
-
ChannelFuture future = bootstrap.connect("localhost",8080).sync();
-
Channel channel = future.channel();
-
BufferedReader in =newBufferedReader(newInputStreamReader(System.in));
-
while(true){
-
channel.writeAndFlush("ChatClient说:"+ in.readLine()+"\r\n");
-
}
-
}catch(Exception e){
-
e.printStackTrace();
-
}finally{
-
group.shutdownGracefully();
-
}
-
-
}
-
-
}
ChatClientA与ChatClientB代码一模一样,因为需要实现聊天功能,所以需要启用至少2个客户端,故Copy一样的代码,分别启动ChatClientA与ChatClientB;
先启动ChatServer.main(),然后分别启动ChatClientA与ChatClientB的main()方法
分别在ChatClientA和ChatClientB的控制台输入聊天内容,聊天结果如下:
ClientA:
ClientB:
微信扫一扫
关注该公众号
相关推荐
通过学习和实践 Netty 实现的 WebSocket 服务,你可以构建出强大的实时通讯系统,适用于游戏、金融、物联网等多种场景。不过,实际生产环境中,还需要考虑负载均衡、容错恢复、安全性等更多因素,以确保服务的稳定性...
在本文中,我们将深入探讨基于 Netty 的聊天应用开发,重点关注服务端与客户端的通信以及如何通过代码实践增强理解。 一、Netty 框架概述 Netty 是由 JBoss 提供的开源框架,它简化了网络编程,特别是 TCP 和 UDP ...
总的来说,Netty版WebSocket聊天是一个学习和实践WebSocket与Netty结合的绝佳案例。通过这个项目,开发者不仅可以了解到WebSocket的基本用法,还能深入理解Netty框架的底层原理和使用技巧,从而提升在网络编程领域的...
1. "Netty聊天程序(实战一):从0开始实战100w级流量应用" 这一部分主要讲述了如何使用Netty框架构建一个能够处理大规模并发连接的聊天应用程序。Netty是一个高性能、异步事件驱动的网络应用框架,适用于开发高并发...
总的来说,这个项目展示了Netty如何与GUI库结合,提供一个实时、高效的多人聊天解决方案。通过学习和分析这个项目,你可以深入理解Netty的网络编程模型,以及如何构建交互式GUI应用。这对于想要在Java领域从事网络...
【Java基于Netty实现的聊天室】是一种使用Java编程...这个Java Netty聊天室项目是一个很好的学习和实践网络编程和Netty框架的起点,开发者可以通过它深入了解网络通信的原理,以及如何利用Netty构建高性能的网络应用。
Netty 是一个高性能、异步事件驱动的网络应用程序框架,用于快速开发可维护的高性能协议服务器和客户端。在这个“netty实现简单的聊天”的项目中,...通过学习和实践,我们可以深入理解Netty在网络编程中的强大能力。
Netty 是一个高性能、异步事件驱动的...实践中,还可以进一步优化,比如添加用户认证、聊天室功能、文件传输等,使聊天应用更加完善。在实际工作中,Netty 的强大性能和灵活性使其成为许多高性能网络应用的首选框架。
这是一个基于Netty、WebSocket和Spring Boot技术实现的实时...通过实践这个项目,开发者可以深入理解Spring Boot的自动化配置、Netty的网络编程模型以及WebSocket在实时通信中的应用,同时也能锻炼前后端协作的能力。
在本文中,我们将探讨如何使用HTML5的WebSocket API在前端构建实时聊天应用,以及如何在后端利用...通过持续学习和实践,你可以进一步掌握WebSocket与Netty结合开发聊天系统的技巧,构建出更复杂、功能丰富的Web应用。
这对于构建分布式聊天系统或者实时通知系统非常有用。 首先,我们要理解Netty的核心概念,包括Bootstrap(启动引导类)、ServerBootstrap(服务器启动引导类)、Channel(通道)和EventLoop(事件循环)。Bootstrap...
该项目是一个实现类似哔哩哔哩...总结,这个项目展示了如何整合多种技术来构建一个实时的、高并发的在线聊天系统,涉及到了前后端分离、实时通信、数据库设计、安全性等多个方面,是学习和实践现代Web开发的优秀案例。
【标题】:“netty_chat:基于Netty的聊天系统” ...综上所述,“netty_chat”项目是一个很好的学习资源,它演示了如何结合Netty和WebSocket技术创建实时聊天应用,有助于理解和实践这两种技术在实际开发中的应用。
在IT行业中,构建高效、可扩展的网络通信系统是至关重要的。这个项目“基于netty和protobuf的聊天系统,...同时,这个聊天系统也可以作为进一步开发分布式系统、实时通信应用的基础,具有很高的学习价值和实践意义。
在即时聊天系统中,Netty以其高效的IO处理能力和灵活的架构,承担起消息传输的重任,确保消息的实时性和可靠性。 Message Queue(MQ)是解耦和提高系统响应速度的关键组件。在本项目中,可能是RabbitMQ或Kafka等MQ...
这个“netty聊天小例子”提供了一个简单的服务端和客户端应用,可以帮助我们理解Netty如何在实际场景中工作。 首先,Netty 的核心特性包括其基于NIO(非阻塞I/O)的事件驱动架构。这种架构允许Netty在处理大量并发...
总的来说,《Netty进阶之路-跟着案例学Netty》是一本深入浅出、实践性强的Netty教程,无论你是初学者还是有一定经验的开发者,都能从中受益匪浅,提升你的网络编程技能。通过阅读这本书,你将能够熟练地利用Netty...
- **案例一:简单聊天室**:构建一个基于Netty的多人在线聊天室,实现消息的实时发送与接收。 - **案例二:文件传输服务器**:设计一个可以支持多用户同时上传下载文件的服务端程序。 - **案例三:物联网监控平台**...
总的来说,这个项目展示了如何将 `Spring` 的便捷性、`Netty` 的高性能以及 `WebSocket` 的实时通信能力结合起来,构建一个能够处理高并发聊天需求的应用。通过引入 `RocketMQ`,还可以进一步提升系统的可扩展性和...