Socket组包和分包快速理解及相关示例

本文详细介绍了在Socket通信中如何进行数据的分包和组包操作,包括使用字节流进行组包和拆包的过程,以及C++和Java语言的具体实现案例,帮助读者理解并掌握Socket通信中的关键环节。

socket 分包和组包:建议使用字节流。组包和拆包是一个近似序列化和反序列化的过程。

目录

组包

拆包

C++组包发送与拼包解析

组包拆包示例


消息形式为: 包长度(short)+包头(short)+messages(string)+包尾(short)

组包

组包的意思是按照协议构建二进制数组数据。

private void writesMessage(short cmd , String messages, short move,Socket socket) { 
        initOutput(); 
        try { 
            output.writeShort(cmd); 
            output.writeChars(messages); 
            output.writeShort(move); 
            MyUtil.sendMessage(socket, byteOutput.toByteArray()); 
        } catch (Exception e) { 
            e.printStackTrace(); 
        } 
    } 
     
    private void initOutput() 
    { 
        byteOutput = new ByteArrayOutputStream(); 
        output = new DataOutputStream(byteOutput); 
    } 
 
/**
     * 发送数据到网络流
     * 
     * @param socket
     * @param bytes
     * @throws Exception
     */ 
    public static void sendMessage(Socket socket, byte[] bytes)throws Exception { 
        DataOutputStream dataOutput = new DataOutputStream(socket.getOutputStream()); 
        // 编写数据的长度 
        dataOutput.writeShort(bytes.length); 
        dataOutput.write(bytes); 
        dataOutput.flush(); 
    } 


拆包

按照协议将二进制数组数据解析为对应的字段。

 short len = br.readShort();//br 为DataInputStream 
 short cmd = br.readShort(); 
 byte[] bytes = new byte[len]; 
 br.read(bytes, 0, len-4); 
 String messgeString = new String(bytes);  
 System.out.println("首条消息:"+messgeString); 
 short move = br.readShort(); 

C++组包发送与拼包解析

BYTE m_Buffer[100000];
int m_iLen=0;
void RecvTCP(const char * pBuffer, int iLen)
{
    memcpy(m_Buffer + m_iLen, pBuffer, iLen);
    int length = iLen + m_iLen;
    int nPackage = length / 1008;
    for (int i = 0; i < nPackage;i++)
    {
       //处理…
    }
    m_iLen = length - 1008 * nPackage;
    memcpy(m_Buffer, m_Buffer + nPackage * 1008, m_iLen);
}

组包拆包示例

XTCP 一个便捷的TCP消息包拼装和解析框架

【Java TCP/IP Socket】构建和解析自定义协议消息(含代码)

定长消息报文的组包与解包简单封装(Java实现)

自定义Udp/Tcp协议,通信协议Socket/WebSocket,IM粘包、分包解决等(2),ProtocolBuffer

Java网络编程(五)socket的半包,粘包与分包的问题

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值