zoukankan      html  css  js  c++  java
  • TCP 粘包

    import (
    	"bufio"
    	"bytes"
    	"encoding/binary"
    )
    
    // Encode 将消息编码
    func Encode(message string) ([]byte, error) {
    	// 读取消息的长度,转换成int32类型(占4个字节)
    	var length = int32(len(message))
    	var pkg = new(bytes.Buffer)
    	// 写入消息头
    	err := binary.Write(pkg, binary.LittleEndian, length)
    	if err != nil {
    		return nil, err
    	}
    	// 写入消息实体
    	err = binary.Write(pkg, binary.LittleEndian, []byte(message))
    	if err != nil {
    		return nil, err
    	}
    	return pkg.Bytes(), nil
    }
    
    // Decode 解码消息
    func Decode(reader *bufio.Reader) (string, error) {
    	// 读取消息的长度
    	lengthByte, _ := reader.Peek(4) // 读取前4个字节的数据
    	lengthBuff := bytes.NewBuffer(lengthByte)
    	var length int32
    	err := binary.Read(lengthBuff, binary.LittleEndian, &length)
    	if err != nil {
    		return "", err
    	}
    	// Buffered返回缓冲中现有的可读取的字节数。
    	if int32(reader.Buffered()) < length+4 {
    		return "", err
    	}
    
    	// 读取真正的消息数据
    	pack := make([]byte, int(4+length))
    	_, err = reader.Read(pack)
    	if err != nil {
    		return "", err
    	}
    	return string(pack[4:]), nil
    }
    

      

  • 相关阅读:
    如何仅仅修改每一页的页眉
    resize
    Linux搭建深度学习环境
    Image.open、cv2.imread
    any、all
    cookie
    any、all
    库文件
    出来混总要还的,要提醒自己提高核心竞争力
    “行百里者半九十”(现在才逐渐真正理解这些道理)
  • 原文地址:https://www.cnblogs.com/ruanqin/p/14147911.html
Copyright © 2011-2022 走看看