Netty的深入浅出--4.实现简单的聊天程序
聊天程序的服务端:
创建一个MyChatServer的main函数:
创建解码器DelimiterBasedFrameDecoder(根据分隔符将消息解码)
对于该解码器后续在进行详细讲解,现在只要知道这是干嘛的就行了
下面这些就是字符的编码和解码类型设置
将管道初始化器加入到MyChatServer主函数中:
创建自定义处理器MyChatServerHandler
下面将会实现的需求是:当客户端A与服务器 建立连接之后,客户端B与服务器建立连接,这时候服务器会发广播告诉客户端A:客户端B上线。客户端C与服务器建立连接,这时候服务器发广播告诉服务端A、服务端B:客户端C上线
创建一个管理管道的组
通过DefaultChannelGroup来构造的
其中传入的GlobalExecutor.INSTANCE实例
而这个实例就是类本身
将与服务器建立好连接的所有客户端保存:
将信息发送到所有组内已经连接了的客户端中:
查看writeAndFlush,它是由write和flush组成
说明信息: 将信息发送给所有连接这的channel(客户端)
这里说明一下,writeAndFlush在add方法的前面:因为在添加channel之前发送广播的话,广播就不会发送给当前channel本身了。
当客户端断开之后,广播给其他用户
很多人会疑问这个处理器是自己定义的,为什么会自动调用呢?这些内容后面会写,大家不要着急,现在只是了解一下netty中一些类型和组件的使用。
打印连接成功之后,上线的客户端:
打印客户端断开连接之后,下线 的客户端
下面这个channel就是当前向服务器端发送消息 的客户端:
区别当前客户端和其他客户端,并且将消息发送给所有客户端
将MyChatServerHandle放入到管道初始化器MyChatServerInitializer中
到这里聊天程序的服务端 已经完成
编写聊天程序的客服端:
创建MyClient客服端主函数:
创建管道初始化器MyChatClientInitializer(配置和服务端管道初始化器是一样的)
将管道初始化器加入到MyChatClient中:
创建管道处理器MyChatClientHandler
直接打印控制台给它返回的 信息就ok了:
在管道初始化器中加入自定义管道处理器MyChatClientHandler
这个关闭就不用了,我们直接使用死循环
不断读取用户在控制台输入的参数
启动服务器、客服端
打开多个客服端
输入信息: