java tcp通信如何组包,望大侠出招

解决方案 »

  1.   

    这个不够清楚吗?举个例子:
    对象A:包含了"管理"操作用到的属性。即用户注册,转账等等管理操作需要用到的所有属性。。
    对象B:包含了"认证"操作用到的属性。即用户登录,交易认证等等认证操作需要用到的所有属性。。并且对A,B中的所有属性作定长处理,即为每个属性定义长度,这个长度一般在和银行讨论后由银行来定。那么,可以统一将你项目所有的操作分为两种类型的包:管理包,认证包两种。当你做认证操作时,将用到的数据封装为B对象,然后根据为每个属性定长的长度,写一个方法,将对象按照属性的长度转换为一个长字符串,当实际参数值长度不够,就用空格填充。这样你每次转换出来的字符串长度就是一样的。。因为没有的参数属性和长度不够的 都用空格代替了。。
    这样就出来了一个定长字符串发送给服务器服务器再根据B对象的转换规则,将定长字符串转换为B的每个属性,提供给服务器认证时的数据。这样就是所谓的定长包同理,管理的包也这么做。。当然定长包是不支持查询接口的查询接口不能用定长
    LZ可以结贴了
      

  2.   

    楼主,可是我这边服务器是c写得,客户端要java接收。发过来的结构体如下
    先接收8个字节的头部信息 即DATA_PACKET中的nFlag 和 nSize
    typedef struct tagDATA_PACKET
    {
    ULONG nFlag;
    ULONG nSize;
        DATAPACK packData;
    }DATA_PACKET,*PDATA_PACKET;typedef struct tagDATAPACK
    {
    WORD IsSampleHead; //是否是一帧数据的开始
    WORD BufSize; // Buf 中有多少音视频可用
    FRAME_HEADER FrameHeader;
    BYTE PackData[1024]; //音视频数据
    }DATAPACK, *PDATAPACK;//帧头结构
    typedef struct tagFRAME_HEADER
    {
    WORD wMotionDetect; //运动量
    WORD wFrameIndex; //帧索引
    DWORD nVideoSize; //视频大小
    DWORD nTimeTick; //时间戳
    WORD nAudioSize; //音频大小
    BYTE bKeyFrame; //是否关键帧
    BYTE nPackIndex; //包索引
    }FRAME_HEADER,*PFRAME_HEADER;判断nFlag是否为9000,根据nSize大小准备接收DATAPACKDATAPACK 中PackData[1024]即为音视频数据 大小为BufSize
      

  3.   

    楼主,可是我这边服务器是c写得,客户端要java接收。发过来的结构体如下,采用的是tcp,java代码客户端接收组包
    先接收8个字节的头部信息 即DATA_PACKET中的nFlag 和 nSize
    typedef struct tagDATA_PACKET
    {
    ULONG nFlag;
    ULONG nSize;
      DATAPACK packData;
    }DATA_PACKET,*PDATA_PACKET;typedef struct tagDATAPACK
    {
    WORD IsSampleHead; //是否是一帧数据的开始
    WORD BufSize; // Buf 中有多少音视频可用
    FRAME_HEADER FrameHeader;
    BYTE PackData[1024]; //音视频数据
    }DATAPACK, *PDATAPACK;//帧头结构
    typedef struct tagFRAME_HEADER
    {
    WORD wMotionDetect; //运动量
    WORD wFrameIndex; //帧索引
    DWORD nVideoSize; //视频大小
    DWORD nTimeTick; //时间戳
    WORD nAudioSize; //音频大小
    BYTE bKeyFrame; //是否关键帧
    BYTE nPackIndex; //包索引
    }FRAME_HEADER,*PFRAME_HEADER;判断nFlag是否为9000,根据nSize大小准备接收DATAPACKDATAPACK 中PackData[1024]即为音视频数据 大小为BufSize
      

  4.   

    简单的数据格式为:TLV。
    T就是Tag,标识这条指令做什么。
    L就是Lenth,标识后续数据的长度,按字节计算。
    V就是Value,就是业务内容。关于C和java的通信,直接传输二进制byte数组就可以了,双方都能识别。
    比如报文:80029090其中80是TAG,02是长度表示有两个字节的后续数据,9090是数据内容。它的byte数组值是 {0x80,0x02,0x90,0x90},注意不要转换成acii码,那会浪费空间。
      

  5.   

    传的是byte,可是根据我接收到的数据,有时候缓冲区接收到的数据的大小在变,所以tcp端很难组包,是不是我的接收方式有问题?