在网络编程中,不管使用netty仍是其它的socket通信框架,都是经过TCP或UDP传输二进制流。发送方把要发送的对象转化成二进制流发送出去;接收方把接收到的二进制流转化为对象进行处理。 为了能让接收方和发送方能对同一个二进制流有相同的认识,双方必须提早约定好一个协议,即对象如何转化为二进制流,二进制流如何转化为对象,这样通讯双方才不会产生误解。java
在 easy-im 项目中,定义以下通讯协议:git
版本号: 1字节,通常是预留字段,为了支持协议升级(这种状况极少出现)。程序员
序列化算法:1字节,表示如何将java对象转化为二进制数据,以及如何反序列化。github
指令:1字节,表示该消息的意图,如私聊、群聊、登陆等。最多支持256种指令。web
数据长度:4字节,表示该字段后数据部分的长度。算法
数据:具体数据的内容。每种指令对应的数据是不一样的。编程
本项目为了简单起见,使用json序列化算法。将Java对象转换成json字符串,再转化为二进制数据,代码以下: json
定义Packet类,做为全部指令的基类,其中getCommand方法为抽象方法,需由子类实现,返回具体的指令类型。微信
定义好序列化算法和指令以后,就能够进行编解码的实现了。编码即将通讯包转化为二进制;解码即将二进制转化为通讯包。websocket
编码过程比较简单,代码以下,参照注释便可明白,ByteBuf里便是最后要发送的二进制数据:
能够看到,编码与解码是相反的过程。
基于netty做为网络通讯基础组件时,咱们必需要作以下几个步骤:
若是采用http、websocket等公有协议通讯,netty提供了许多类能够实现步骤1,2,3,无需咱们编码实现,只需调用相应的类和方法便可。
参考文档: 《netty入门实战:仿写微信IM及时通信系统》
欢迎关注公众号:程序员顺仔