• socket解决半包、粘包问题


      最近项目遇到socket服务端接收报文不全的问题,与其客户端约定的是报文长度+报文体。然而当客户端数据量大的时候,用分包发送,导致服务端报文日志接收不完整,于是想着先读出包体长度,再读出包体,不够就一直读,部分代码如下:

                        InputStream reader = socket.getInputStream();  
                        if (bytes.length < PACKET_HEAD_LENGTH) {  
                            byte[] head = new byte[PACKET_HEAD_LENGTH - bytes.length];  
                            int couter = reader.read(head);  
                            if (couter < 0) {  
                                continue;  
                            }  
                            bytes = mergebyte(bytes, head, 0, couter);  
                            if (couter < PACKET_HEAD_LENGTH) {  
                                continue;  
                            }  
                        }  
                        // 取7长度的字节子数组作为报文长度 
                        byte[] temp = new byte[0];  
                        temp = mergebyte(temp, bytes, 0, PACKET_HEAD_LENGTH);  
                        String templength = new String(temp);  
                        int bodylength = Integer.parseInt(templength);//包体长度  
                        if (bytes.length - PACKET_HEAD_LENGTH < bodylength) {//不够一个包  
                            byte[] body = new byte[bodylength + PACKET_HEAD_LENGTH - bytes.length];//剩下应该读的字节(凑一个包)  
                            int couter = reader.read(body);  
                            if (couter < 0) {  
                                continue;  
                            }  
                            bytes = mergebyte(bytes, body, 0, couter);  
                            if (couter < body.length) {  
                                continue;  
                            }  
                        }  
                        byte[] body = new byte[0];  
                        body = mergebyte(body, bytes, PACKET_HEAD_LENGTH, bytes.length);  
                        count++;  
                        System.out.println("server receive body:  " + count+new String(body));  
                        bytes = new byte[0];  
    mergebyte方法如下:
            public byte[] mergebyte(byte[] a, byte[] b, int begin, int end) {  
                byte[] add = new byte[a.length + end - begin];  
                int i = 0;  
                for (i = 0; i < a.length; i++) {  
                    add[i] = a[i];  
                }  
                for (int k = begin; k < end; k++, i++) {  
                    add[i] = b[k];  
                }  
                return add;  
            }

    这样server端接收到的都是完整的包。

    休闲玩家 佛系更博
  • 相关阅读:
    第一课时之导读
    python学习之第十六课时--缩进(indentation)
    python学习之第十六课时--函数的作用及定义
    python学习之第十五课时--存址方式及拷贝
    Linux学习之第七课时--链接(link)文件
    Linux学习之第六课时--文件和目录操作管理命令
    Linux学习之第五课时--文本编辑器
    TOJ--1162---dfs(回溯)
    TOJ---3128---bfs(打印路径)
    TOJ---1502---map真强大
  • 原文地址:https://www.cnblogs.com/yuyuchen/p/9090801.html
Copyright © 2020-2023  润新知