mina 在发送长报文时,为什么被截成好几段呢。请大侠帮帮忙。

问题描述

mina在发送长报文时,为什么被截成好几段呢。请大侠帮帮忙。

解决方案

解决方案二:
这个是必然的。物理限制,和mina无关。你使用的默认解码器或者自己写的解码器的一个功能,就是将可能的N个物理包,变成一个逻辑包。每个逻辑包,包头应当由标志位(这个逻辑包是什么数据)以及长度位(这个逻辑包长度是多少,个别固定长度的逻辑包,可以省略)。每次,解码的时候,读取bytebuffer的头,看看当前解析的是什么包,然后长度是多少,再比较一下,当前的bytebuffer长度够不够,如果不够的话,则将bytebuffer的指针重新mark到0,并不处理当前的bytebuffer下次接收到的物理包的bytebuffer会和这次没解析玩的拼在一起,位置还是在这个逻辑包的开头位置,一直到接收到足够的数据。另外,要注意的是,最后一个包,可能还包含下一次的逻辑包的开头部分,在解析完当前包的时候,要注意最后把position设置到正确位置。以免下一个逻辑包丢数据。下面是一个我很早前些的mina1的例子//$Id:AbstractPacketDecoder.java,v1.52008/06/1519:07:27michaelExp$packagexxx.codec.decoder;importorg.apache.commons.logging.Log;importorg.apache.commons.logging.LogFactory;importorg.apache.mina.common.ByteBuffer;importorg.apache.mina.common.IoSession;importorg.apache.mina.filter.codec.ProtocolDecoderOutput;importorg.apache.mina.filter.codec.demux.MessageDecoderAdapter;importorg.apache.mina.filter.codec.demux.MessageDecoderResult;/***数据包解码对象解码器抽象超类。**@version$Revision:1.5$$Date:2008/06/1519:07:27$*@param*<P>*解码器返回的数据包内容*/publicabstractclassAbstractPacketDecoder<P>extendsMessageDecoderAdapter{/***每个数据包头的默认长度:3字节(1位标志位+2位长度位)。*个别标志位下4位长度位或者没有长度位的情况下,请覆盖@{coderetrieveHeaderLength()}方法。*@see#retrieveHeaderLength()*/publicstaticfinalintDEFAULT_HEADER_LENGTH=3;/***日志对象*/protectedfinalLoglog=LogFactory.getLog(getClass());/***数据包类型*/protectedbytetype;/***创建一个新的<code>AbstractPacketDecoder</code>对象。**@paramtype*可以解码的数据类型*/protectedAbstractPacketDecoder(bytetype){this.type=type;}/***判断当前解码器能否解码最新读入的数据。**@paramsession*连接会话*@paramin*读入的字节缓冲*@return是否可解码:{@codeMessageDecoder.OK}可以解码;*{@codeMessageDecoder.NOT_OK}不能解码;*{@codeMessageDecoder.NEED_DATA}需要更多数据才能判断是否能够解码*@seeorg.apache.mina.filter.codec.demux.MessageDecoder#decodable(org.apache.mina.common.IoSession,*org.apache.mina.common.ByteBuffer)*/publicMessageDecoderResultdecodable(IoSessionsession,ByteBufferin){//数据包头长度intheaderLength=retrieveHeaderLength();if(in.remaining()<headerLength){//读入的字节缓冲中的剩余数据长度小于数据包头长度,需要更多数据//注意:即使有标志位便可以确认当前类能否解码,仍然需要确保第一次解码时能够正确读入长度数据returnNEED_DATA;}//数据包类型bytecontentType=in.get();if(contentType==type){//数据包类型与当前解码器可以解码的数据类型匹配,可以解码returnOK;}else{//数据包类型与当前解码器可以解码的数据类型匹配,不能解码returnNOT_OK;}}/***解码最新读入的数据。**@paramsession*会话连接*@paramin*读入的字节缓冲*@paramout*存放解码结果的输出*@return处理结果:{@codeMessageDecoder.OK}可以解码;{@codeMessageDecoder.NOT_OK}*不能解码;{@codeMessageDecoder.NEED_DATA}需要更多数据才能判断是否能够解码*@throwsException*如果在处理中发生异常的话*@seeorg.apache.mina.filter.codec.demux.MessageDecoder#decode(org.apache.mina.common.IoSession,*org.apache.mina.common.ByteBuffer,*org.apache.mina.filter.codec.ProtocolDecoderOutput)*/publicMessageDecoderResultdecode(IoSessionsession,ByteBufferin,ProtocolDecoderOutputout)throwsException{//记录原有位置in.mark();//跳过数据包标志位in.get();//数据包长度intcontentLength=getContentLength(session,in);if(in.remaining()<contentLength){//当前物理数据包长度小于逻辑数据包长度,重置开始位置in.position(in.markValue());//需要更多数据returnNEED_DATA;}//解码数据体Ppacket=decodeBody(session,in,contentLength);if(packet==null){//错误returnNOT_OK;}//保存数据包对象out.write(packet);//解码成功returnOK;}/***返回数据包头的长度。*<p>*针对个别包4位长度位或者没有长度位的情况,子类应该覆盖该方法,返回对应的数据包头长度。*</p>**@return数据包头的长度*/protectedintretrieveHeaderLength(){returnDEFAULT_HEADER_LENGTH;}/***获取数据体(不含标志位及长度位本身)的字节长度。*<p>*本方法会在获取数据包类型后被调用,默认从当前字节缓冲中读取2字节长度信息。*</p>*<p>*子类可以覆盖该方法,直接返回长度信息而不从字节缓冲中读取。*</p>**@paramsession*会话连接*@paramin*字节缓冲*@return数据体长度,它可以是:*<ul>*<li>从数据包中特定位置读取的长度信息</li>*<li><code>NEED_MORE_LENGTH_INFO</code>代表需要更多字节才能判断长度</li>*</ul>*/protectedintgetContentLength(IoSessionsession,ByteBufferin){returnin.getShort();}/***解码数据体内容,并返回对应的数据对象。**@paramsession*会话连接*@paramin*读入的字节缓冲*@paramcontentLength*数据体长度*@return数据体内容解码后得到的对应的数据对象,或者<code>null</code>代表解码时发生错误。*@throwsException*如果在处理中发生异常的话*/protectedabstractPdecodeBody(IoSessionsession,ByteBufferin,intcontentLength)throwsException;}

解决方案三:
该回复于2011-10-31 13:58:16被版主删除
解决方案四:
能不能把你的mina1的例子发给我看看,邮箱xmt1990@126.com

时间: 2025-01-20 21:43:12

mina 在发送长报文时,为什么被截成好几段呢。请大侠帮帮忙。的相关文章

gcc-GCC编译时 链接阶段未指定正确的库文件 请大神帮忙看下

问题描述 GCC编译时 链接阶段未指定正确的库文件 请大神帮忙看下 解决方案 头文件有正确包含么?函数名拼写正确么?没找到这个函数. 解决方案二: 你的函数库文件没有link,你需要编译的时候通过-L来指定对应的lib 解决方案三: 我在做linphone 然后就出现问题了

json-各位大神 请问我序列化时数据库数据应该做成什么格式的呢?帮帮忙 小弟初学

问题描述 各位大神 请问我序列化时数据库数据应该做成什么格式的呢?帮帮忙 小弟初学 我要从数据库中将数据放到datetable中然后序列化成下边这种json格式的数据 请问我数据库中数据应该怎么存贮呢? . json数据 [{"CountryName": "阿拉伯联合酋长国","Province": [{"ProvinceName": "Bahrani","City": [{"

哪位大侠帮帮忙,我的GridView更新时出问题了

问题描述 前几年都是用ASP,出.NET后一直没写过程序,也接触得少了,现在学.NET2有个新问题,怎么都没解决,烦请大侠帮忙解决解决.我有一张学生表:LJXHXM--还有其它字段.上面字段的意思依次是年级.学号.姓名,我用了一个GridView,如下:<asp:GridViewID="myGrid"runat="server"AllowPaging="True"OnSelectedIndexChanged="myGrid_Sel

跪求各路大侠帮帮忙-在三层加.net mvc4.0 中使用ztree显示分类时为什么得到的显示效果是undefined

问题描述 在三层加.net mvc4.0 中使用ztree显示分类时为什么得到的显示效果是undefined 我Controller中的代码如下: public ActionResult LoadAllCat() { List list = null; list = new List(); List lists = categoryService.GetCategory(); foreach (var listcat in lists) { Category category = new Cat

用例子测试juddi时出现的问题请大家帮忙了,好几天了,没有任何进展! 请大家帮帮忙吧!

问题描述 ***********RunningSaveBusinessExample***********GetauthtokenExceptioninthread"main"java.lang.NoClassDefFoundError:org/apache/axis/AxisFaultatjava.lang.Class.forName0(NativeMethod)atjava.lang.Class.forName(UnknownSource)atorg.uddi4j.transpor

安装时出错 请大家帮帮忙

问题描述 安装一半的时候出现此窗口!请大家帮帮忙谢谢feature;defaultfeaturecomponent;newcomponent4file;c;programfiles......data1.2libdependenciesorojaka28c8.rraerror;系统找不到指定的文件, 解决方案 解决方案二:安装什么的?解决方案三:安eclipse解决方案四:卸干净了再重装吧解决方案五:关键是没安上怎么卸载啊

接纳时间同步服务器端口自身发送的报文

  该字段发送报文的源端口地址信息,包含时钟设备和端口序列号该字段界说不同报文的序列号.操控域该字段界描绘报文类型的字段,类似于别的报文类型,仅仅少了一些选项.该值取决于哪字段界说的报文类型,并应具有表规则的值.规范不赞成接收方运用该宇段的值.当发送加报文时的值应为或许为发起时钟本地时刻的估计值.差错不大于为与时刻标尺间的闰秒时刻差.   表明用户界说的优先级,侧舰界说为时刻质量等级,界说为的时钟设备.  该报文仅在时钟形式下才会发作:由时钟作为推迟呼应者宣布,内容格朋在形式下的数值为形式下界说

socket-android利用mina框架保持长连接通信

问题描述 android利用mina框架保持长连接通信 最近在学做一个手机客户端,服务端用java mina搭建,客户端也是利用mina 和服务端保持长连接通信. 自己的思路:1打开应用即和服务端建立连接,将session保存 2在不同的activity中用保存的session去请求相关数据 3在mina客户端的接收方法中将服务端得到的服务端响应结果广播出去,在对应的activity中接收该广播 以上思路不知道是否可行或者有什么考虑不全的地方还请各位指正一下,谢谢 解决方案 做过类似的功能,正准

socket发送大量数据时如何接收?

问题描述 小弟在做一个项目是用java的socket发文件的同时也想发送聊天信息.1.对于socket的接收专门由一个线程A来处理,对于socket的发送也专门由一个线程B来处理2.发送和接收都有各自的缓冲区3.专门由一个线程使用监听来检测接收缓冲区的内容,并进行处理显示.问题出现在:当甲向乙发大量的连续的数据时(比如是文件,100M的文件我拆成1000片连续发送),若同时乙要发一条聊天消息则甲不能够即可收到该消息(该消息只能等到甲将文件发送完成后才能收到聊天消息),而若此时甲向乙发聊天消息则能