Netty思维导图
简单的即时通讯系统
接下来一步一步的使用Netty完成一个简单的即时通讯系统。
选择通讯协议
采用protobuf进行消息序列化和反序列化。
mac安装protobuf: brew install protobuf
定义请求消息结构
requestId代表接收消息的用户ID,requestMessage代表用户发出的消息,type代表消息类型,可能的消息类型主要是登录请求,消息和心跳。
定义响应消息结构
responseId代表接收响应的用户ID,responseMessage代表响应消息,type代表消息类型,可能的消息类型主要是消息和心跳。
基于proto文件生成Java类
protoc ./ImRequest.proto --java_out=../java/
protoc ./ImResponse.proto --java_out=../java/
使用ProtoBuf API测试消息序列化和反序列化
创建ImClient
配置IdleStateHandler, 客户端10秒没有发送消息,会触发IdleStateEvent事件。
配置ProtoBuf编码器和解码器,使用Netty自带的编码器和解码器,并且使用基于长度的协议通过将它的长度编码到帧的头部来解决TCP粘包的问题。ProtobufVarint32LengthFieldPrepender会向 ByteBuf 前追加一个 Google Protocal Buffers 的“Base128 Varints”整型的长度字段值。ProtobufVarint32FrameDecoder会根据消息中的 Google Protocol Buffers 的“Base 128 Varints”整型长度字段值动态地分割所接收到的 ByteBuf。
配置ImClientHandler来和ImServer进行信息交互。
最后获取连接到ImServer的Channel, 通过Channel可以主动给ImServer发送消息。
创建ImServer
配置IdleStateHandler,服务端超过11秒钟没有收到客户端的消息,会触发IdleStateEvent事件。这个时候进行心跳检测客户端是否存活。
配置ProtoBuf编码器和解码器。
配置ImServerHandler来和ImClient进行信息交互。
初始化用户信息
一般来说,需要先注册用户,注册成功之后才可以进行登录,简单起见,用户信息先在客户端启动的时候进行初始化。
用户登录
客户端创建成功之后,用户发送登录消息给服务端,登录成功之后,就可以发送消息给其他用户。
服务端保存用户Session
ImServer接收到用户登录消息之后,保存用户的session到sessionMap。
用户互发消息
客户端调用Channel的writeAndFlush发送消息
服务端接收到消息之后解析消息中的userId, 转发消息给真正接收消息的用户
完整代码地址
https://github.com/continuous1024/weekly-report/tree/master/netty-practice/src/main/java/com/huanyu/weekly/netty/im
本文暂时没有评论,来添加一个吧(●'◡'●)