我们知道,进行SOCKET tcp/ip通信的时候,不知道每次接受的报文到底有多长?也就是是判断不了报文(消息)的边界。
一般的做法有下面几种:
1。设定固定长度的报文头,在固定的报文头上增加消息长度。每次读取的时候先读这个报文头,得到本次消息的总体长度。
2。在报文中设定特殊字符作为边界。比如:
***************************
之类的特殊符号等。
MINA2(我采用的版本是MINA2 RC1版本)中我采用第一种方式来读取消息报文。
具体代码:可以利用IoBuffer的prefixedDataAvailable方法得到消息头,可惜看了MINA2的源代码之后,prefixedDataAvailable方法的参数只是是1,2,4,也就是说只能设定1,2,4位长度的消息头,这样如果你是自定义长度的报文头,那可就不支持了,不过可以修改MINA2的源码来实现自己特殊的要求。
如下面的写法:
f (in.prefixedDataAvailable(4)) { //判断是否存在4字节的消息头
int length = in.getInt();
byte[] bytes = new byte[length];
in.get(bytes);
MINA2中,当启动一个服务端的时候,要设定初始化缓冲区的长度,如果不设置这个值,好像系统默认为2048,当客户端发过来的消息超过设定值的时候,MINA2的机制是分段接受的,将字符是放入缓冲区中读取,所以在读取消息的时候,需要判断有多少次。
final IoAcceptor acceptor = new NioSocketAcceptor();
acceptor.getSessionConfig().setReadBufferSize(2048);
这样的话,我们如来来判断几次接收只有是一个完成的消息呢?一种做法是将你的数据分段的放入session中,每次从session中读取,直到读取完整之后,再做解码--业务操作。由于MINA2解决了通讯问题,那么我们只需要关心解码问题了。
分享到:
相关推荐
通过mina实现定长报文传输(报文使用ssl加密-mian自带的ssl过滤器)。
mina2源码
mina的高级使用,mina文件图片传送,
mina自定义编解码 不错的资源 ----其实不怎么样,技术就是拿出来共享的,开源。大家一起前进
许多刚接触mina的朋友,对于mina的编解码器的编写很迷惑.希望这个文档可以帮助朋友们少走弯路。 资源中是一个比较典型的编解码器写法。生成了可执行文件。并对编解码器的代码有详细注释。
mina2学习笔记
mina2技术知识非常实用的 不用自己写多线程的东西的
mina2核心框架5000个并发
不错的MINA2源码呵,带有MINA2的原实例
mina2+spring结合实例
Apache Mina 2 官方教程翻译
Apache Mina 2 完全自学手册
Apache MINA2实用手册 Apache MINA2实用手册
关于apache mina2 的学习资料 包括状态机
公司需求,做的简单的Demo,可以拓展,Mina自定义协议简单实现,象征性得收取2积分
Mina2源码分析,学习mina不可多得的文档资料
SSI+Mina2(Struts2+Spring4+Mybatis3+Mina2)集成,都是最新的包, 发布就可运行,配置文件都写了详细的注释。
本源码是《NIO框架入门(二):服务端基于MINA2的UDP双向通信Demo演示》一文的MINA2服务端源码实现,详见:http://www.52im.net/thread-373-1-1.html
mina2推送demo客户端资源,测试过可以使用,正式可靠,比较试用学习
Mina文件上传的例子 mina mina2 file 文件上传