日期:2014-05-20  浏览次数:20717 次

MINA粘包消息
自定义的TCP/IP协议,在传输大消息时容易有粘包现象发生,请高手赐教如何进行拆包解包,谢谢!!
协议格式类似:0x7e 0x00 0x19 0x85 0x83 0x74 0x7e,其中0x7e为消息头、尾标记。

------解决方案--------------------
探讨
另外,一个逻辑包,会分散在几个Buffer里面?那样的话岂不是拆包组包就没法做了吗?

------解决方案--------------------
信息不会丢失,你总是可以再重组的
------解决方案--------------------
我没用过 Mina,但是我可以推荐你参考一下其他 Socket 框架的做法:

Grizzly:
http://grizzly.java.net/nonav/docs/docbkx2.0/html/coreframework-samples.html
User Guide 第二章的样例:解析收到的消息。Grizzly 采用了消息过滤器的机器,在消息过滤器的 handleRead 中处理收到的消息,完整的代码详见:
http://java.net/projects/grizzly/sources/git/content/samples/framework-samples/src/main/java/org/glassfish/grizzly/samples/filterchain/GIOPFilter.java

xSocket:
http://xsocket.sourceforge.net/core/tutorial/V2/TutorialCore.htm
第 18 节的代码以及下面的图示。xSocket 使用监听方法 onData 处理收到的消息桢。

Netty:
http://netty.io/docs/3.2.6.Final/api/org/jboss/netty/handler/codec/frame/FrameDecoder.html
FrameDecoder 的 API 文档。Netty 抽象了一个“消息桢解码器”的类来处理这些。

我找了一下 Mina 2 的文档,也有类似 Netty FrameDecoder 相关的类:
http://mina.apache.org/chapter-11-codec-filter.html

------解决方案--------------------
看上去好乱,第一包数据是从哪里开始丢掉的呢