2014年4月21日 17:35:26

GJ公司的socket数据 自定义格式解析

step 1:

  1. 基于Tornado的自定义协议实现与内存布局优化

  2. Java TCP/IP Socket】应用程序协议中消息的成帧与解析(含代码)-->《据链路层原理及应用精解》:

 成帧技术是一种用来在一个比特流内分配或标记信道的技术,为电信提供选择基本的时隙结构和管理方式、错误隔离和分段传输协议的手段。

   帧是一系列标准化的数据位,是网络通信的基本单元。它的一般格式为一个标题和一个数据有效荷载区。尽管数据区是可变的,帧的大小则通常是固定的。大多数数据链路网络使用大小可变的帧,这种帧有优点(更有效地使用网络)也有缺点(不可预测的信息流以及不能提供高质量的服务)。

TCP/IP协议唯一的约束:信息必须在块中发送和接收,而块的长度必须是8位的倍数,因此,我们可以认为TCP/IP协议中传输的信息是字节序列。

由于协议通常处理的是由一组字段组成的离散的信息,因此应用程序协议必须指定消息的接收者如何确定何时消息已被完整接收。成帧技术就是解决接收端如何定位消息首尾位置问题的由于协议通常处理的是由一组字段组成的离散的信息,因此应用程序协议必须指定消息的接收者如何确定何时消息已被完整。主要有两种技术使接收者能够准确地找到消息的结束位置:

1、基于定界符:消息的结束由一个唯一的标记指出,即发送者在传输完数据后显式添加的一个特定字节序列,这个特殊标记不能在传输的数据中出现(这也不是绝对的,应用填充技术能够对消息中出现的定界符进行修改,从而使接收者不将其识别为定界符)。该方法通常用在以文本方式编码的消息中。

2、显式长度:在变长字段或消息前附加一个固定大小的字段,用来指示该字段或消息中包含了多少字节。该方法主要用在以二进制字节方式编码的消息中。

public byte[] nextMsg() throws IOException {
   int length;
   try {
     //该方法读取2个字节,将它们作为big-endian整数进行解释,并以int型整数返回它们的值
     length = in.readUnsignedShort();
   } catch (EOFException e) { // no (or 1 byte) message
     return null;
   }
   // 0 <= length <= 65535
   byte[] msg = new byte[length];
   //该方法处阻塞等待,直到接收到足够的字节来填满指定的数组
   in.readFully(msg);
   return msg;
 }


你可能感兴趣的:(socket)