天下之事,必先处之难,而后易之。

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的半包,粘包与分包的问题

posted @ 2024-08-29 14:39  boonya  阅读(150)  评论(0)    收藏  举报  来源
我有佳人隔窗而居,今有伊人明月之畔。
轻歌柔情冰壶之浣,涓涓清流梦入云端。
美人如娇温雅悠婉,目遇赏阅适而自欣。
百草层叠疏而有致,此情此思怀彼佳人。
念所思之唯心叩之,踽踽彳亍寤寐思之。
行云如风逝而复归,佳人一去莫知可回?
深闺冷瘦独自徘徊,处处明灯影还如只。
推窗见月疑是归人,阑珊灯火托手思忖。
庐居闲客而好品茗,斟茶徐徐漫漫生烟。

我有佳人在水之畔,瓮载渔舟浣纱归还。
明月相照月色还低,浅近芦苇深深如钿。
庐山秋月如美人衣,画堂春阁香气靡靡。
秋意幽笃残粉摇曳,轻轻如诉画中蝴蝶。
泾水潺潺取尔浇园,暮色黄昏如沐佳人。
青丝撩弄长裙翩翩,彩蝶飞舞执子手腕。
香带丝缕缓缓在肩,柔美体肤寸寸爱怜。
如水之殇美玉成欢,我有佳人清新如兰。
伊人在水我在一边,远远相望不可亵玩。