使用Netty传输Pojo对象

使用Netty传输Pojo对象(代替ByteBuf)

怎么做?

 

一、怎么做?

假设有如下场景:客户端传递一个User对象给服务端。如何使用Netty实现Pojo的传输?

(1)Pojo实现Serializable接口

Netty以流(字节流)的形式传递数据,Pojo必须实现Serializable接口,可以序列化(转换为字节流),才能被Netty传递。

User.java

比较标准的一个Pojo。

(2)服务端(接收数据端)实现解码器

本例中服务端需要接收数据,所以需要在channel中注册解码器(指导Netty如何把传输的数据转为Pojo(解码))。

Server.java

我们需要关注这一段:

个人理解:ObjectDecoder是Netty自带的解码器,通过此解码器才能把数据解析为User对象(有这个解码器,Netty才知道要如何把数据解析为Pojo)。

如果不实现解码器,这段代码会报错:

具体错误为:

 

(3)客户端(发送数据端)实现编码器

本例中客户端需要发送数据,所以需要在channel中注册编码器(指导Netty如何把对象编码为可传输、可被解码器解析的字节流(编码))。

Client.java

我们需要关注这一段:

个人理解:ObjectEncoder是Netty自带的编码码器,通过此编码器才能把User对象编码为可传输数据(有这个编码器,Netty才知道要如何对Pojo进行编码(要方便解析器理解,如何解析数据))。

如果不实现解码器,Client在运行时将会被阻塞(无法编译Pojo),无法发送数据。Server无法接收任何数据(体现为Client和Server一直处于运行状态,但是没有任何数据交互)。此时服务端和客户端已经建立了链接,只是一直没有传送数据。如果没有相应的处理机制,链接将一直保持,占用链接资源(非常尴尬)。

二、复杂一点的例子

假设有如下场景:客户端传递一个User对象给服务端,服务端接收到User对象之后,更改User的Username字段,再传递给客户端(形成了双向传输的关系)。如何使用Netty实现双向传输?

根据章节一中的步骤,实现代码如下:

(1)User类实现Serializable接口

User.java

(2)服务端同时实现编码器和解码器

ObjectServer.java

需要发送Pojo,就要实现编码器。需要接收Pojo,就要实现解码器。

(3)客户端同时实现编码器和解码器

ObjectClient.java

至此,完成需求。

三、总结

目前只是掌握了传输Pojo的方法,没有理解详细的原理。以后必须看看Netty的源码。

发布者

xie4ever

《使用Netty传输Pojo对象》上有2条评论

发表评论

电子邮件地址不会被公开。