Netty的深入浅出--81.自定义编解码器简单实例

我们一些一个程序来实现自定义编解码器

Netty的深入浅出--81.自定义编解码器简单实例

客户端handler

Netty的深入浅出--81.自定义编解码器简单实例

服务端

Netty的深入浅出--81.自定义编解码器简单实例

Netty的深入浅出--81.自定义编解码器简单实例

Netty的深入浅出--81.自定义编解码器简单实例

现在服务端如何从客户端接收long类型数据呢?

方法很简单,在我们最后这个处理器前面增加编解码处理器。也就是我们这个程序的目的,创建自定义编解码处理器。

在netty中给我们提供了一个顶层的编解码处理器

Netty的深入浅出--81.自定义编解码器简单实例

要实现解码处理器,我们只需要实现它的decode方法 

Netty的深入浅出--81.自定义编解码器简单实例

  decode方法的doc文档

Netty的深入浅出--81.自定义编解码器简单实例

然后我们往回看

从bytebuf的in里面读数据,然后放入到集合out里面

 Netty的深入浅出--81.自定义编解码器简单实例

 在这里为什么要进行frame detection呢

主要是解决TCP粘包问题

Netty的深入浅出--81.自定义编解码器简单实例

TCP粘包:由客户端发送过来的数据可能会出现两条信息粘在一起,这样的话直接读取是会出现问题的。

拆包:将一条很长的tcp传输过程来信息进行拆开处理 

Netty的深入浅出--81.自定义编解码器简单实例

 创建自定义解码器,至于为什么要判断,一定要考虑清楚哦,不懂看上一篇博客

Netty的深入浅出--81.自定义编解码器简单实例

入站处理器以及完成,现在编写出站处理器

出站处理器的顶层抽象处理器是

Netty的深入浅出--81.自定义编解码器简单实例

Netty的深入浅出--81.自定义编解码器简单实例

MessageToByteEncoder里面的encode()方法 

Netty的深入浅出--81.自定义编解码器简单实例

创建自定义编码器 MyLongToByteEncoder

Netty的深入浅出--81.自定义编解码器简单实例

Netty的深入浅出--81.自定义编解码器简单实例

对于编解码处理器来说他们的顺序可以随意,因为它们本身不在一个链上面。 

Netty的深入浅出--81.自定义编解码器简单实例

启动服务端:

Netty的深入浅出--81.自定义编解码器简单实例

启动客户端

客户端输出

Netty的深入浅出--81.自定义编解码器简单实例

服务端输出

Netty的深入浅出--81.自定义编解码器简单实例

流程分析:

服务端收到客户端发送过来的请求,首先经过MyByteToLongDecoder()处理器

Netty的深入浅出--81.自定义编解码器简单实例

所以第一个打印出“decode invoked!”

Netty的深入浅出--81.自定义编解码器简单实例

可写入的long占 8个字节,打印8

Netty的深入浅出--81.自定义编解码器简单实例

然后进入到下一个处理器MyServerHandler()

Netty的深入浅出--81.自定义编解码器简单实例

打印出远程地址以及消息本身

Netty的深入浅出--81.自定义编解码器简单实例

然后写出客户端,进入MyLongToByteEncode()里面

Netty的深入浅出--81.自定义编解码器简单实例

encode()方法被调用

Netty的深入浅出--81.自定义编解码器简单实例 

分析客户端 

首先由客户端将消息发送过去

Netty的深入浅出--81.自定义编解码器简单实例

 发送完之后进入到MyLongToEncode()里面

Netty的深入浅出--81.自定义编解码器简单实例

打印出相关信息

Netty的深入浅出--81.自定义编解码器简单实例 

写入到网络通道中,然后服务端收到处理完之后,响应回来,进入到MyByteToLongDecoder()

Netty的深入浅出--81.自定义编解码器简单实例 

Netty的深入浅出--81.自定义编解码器简单实例 

又进入到自定义处理器MyClientHandler()中

Netty的深入浅出--81.自定义编解码器简单实例 

Netty的深入浅出--81.自定义编解码器简单实例 

我们发现客服端这个时候又写回数据,这样的话,应该会出现死循序, 但是并没有出现

主要原因是它不是long类型,当消息发送给服务端之后,服务端直接丢弃。

Netty的深入浅出--81.自定义编解码器简单实例