zoukankan      html  css  js  c++  java
  • MINA2判断报文边界

    http://scholers.iteye.com/blog/730429

    我们知道,进行SOCKET tcp/ip通信的时候,不知道每次接受的报文到底有多长?也就是是判断不了报文(消息)的边界。 
      一般的做法有下面几种: 
    1。设定固定长度的报文头,在固定的报文头上增加消息长度。每次读取的时候先读这个报文头,得到本次消息的总体长度。 
    2。在报文中设定特殊字符作为边界。比如: 
    *************************** 
    之类的特殊符号等。 

    MINA2(我采用的版本是MINA2 RC1版本)中我采用第一种方式来读取消息报文。 
    具体代码:可以利用IoBuffer的prefixedDataAvailable方法得到消息头,可惜看了MINA2的源代码之后,prefixedDataAvailable方法的参数只是是1,2,4,也就是说只能设定1,2,4位长度的消息头,这样如果你是自定义长度的报文头,那可就不支持了,不过可以修改MINA2的源码来实现自己特殊的要求。 
      如下面的写法: 
     

    Java代码  收藏代码
    1. f (in.prefixedDataAvailable(4)) { //判断是否存在4字节的消息头  
    2.             int length = in.getInt();   
    3.             byte[] bytes = new byte[length];   
    4.             in.get(bytes);   
    5.   
    6.    




    MINA2中,当启动一个服务端的时候,要设定初始化缓冲区的长度,如果不设置这个值,好像系统默认为2048,当客户端发过来的消息超过设定值的时候,MINA2的机制是分段接受的,将字符是放入缓冲区中读取,所以在读取消息的时候,需要判断有多少次。 

    Java代码  收藏代码
    1. final IoAcceptor acceptor = new NioSocketAcceptor();  
    2. cceptor.getSessionConfig().setReadBufferSize(2048);  



    这样的话,我们如来来判断几次接收只有是一个完成的消息呢?一种做法是将你的数据分段的放入session中,每次从session中读取,直到读取完整之后,再做解码--业务操作。由于MINA2解决了通讯问题,那么我们只需要关心解码问题了。

  • 相关阅读:
    Fiddler抓包工具-拦截,断点
    python-zx笔记11-测试压力管理
    python-zx笔记10-断言
    python-zx笔记9-单元测试
    [Trouble shooting] Alt-A shortcut taken by another app and conflict with Emacs' M-a
    Dwango Programming Contest 6th Task C. Cookie Distribution
    局部有限偏序集上的 Möbius 函数
    一个求和
    一个组合问题
    ABC #150 E. Change a Little Bit
  • 原文地址:https://www.cnblogs.com/balaamwe/p/2319197.html
Copyright © 2011-2022 走看看