ProtocolCodecFilter

来源:互联网 发布:卖家淘宝试用中心 编辑:程序博客网 时间:2024/06/06 04:02

为什么要用ProtocolCodecFilter

因为TCP协议保证所有的包按顺序送达,但它不保证发送方的写操作与接受方的读操作一一对应。具体到MINA中,在不使用ProtocolCodecFilter的情况下,发送方一次调用IoSession.write(Object message)有可能多次触发接受方的messageReceived(IoSession session, Object message)事件,也有可能发送方多次调用IoSession.write(Object message),而接受方只触发一次messageReceived(IoSession session, Object message)事件,当你的客户端和服务端运行在同一台机器上或者运行在同一个子网的时候,你可能不会遇到这个问题,但是你的应用应该支持这种情况

 

你也可以在IoHandler实现这些逻辑,但是使用ProtocolCodecFilter可以让你的代码更干净也更容易理解。

 

 

怎么用

假设你的程序只需要接受一些byte数据,并且把这些数据转换成消息(比较高级的对象)

通常来说有三种方法把字节流转换成消息:

1.使用定长的消息

2.使用定长的消息头,并用它指明消息体的长度

3.使用分隔符,比如许多基于文本的协议都使用回车换行(CR LF  /r/n)作为消息的结尾

在我们的文档中将使用第一和第二中方法,因为他们实现起来比较简单,以后我们会介绍怎么使用分隔符

 

范例

我们将会编写一个(很废柴的)图片字符统计服务器(graphical chargen server 手头字典不行没查出来啥意思乱写的)来展示如何编写你自己的协议编码解码程序(ProtocolEncoder, ProtocolDecoder, and ProtocolCodecFactory)。

 

协议很简单,看起来就是下面这个样子的

 

4byte4byte4bytewidthheightnumchars

 

 

 

 

原创粉丝点击