计算机系统应用教程网站

网站首页 > 技术文章 正文

Netty实战整理

btikc 2024-09-04 03:25:37 技术文章 8 ℃ 0 评论

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

Tags:

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表