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
    }
    

      

  • 相关阅读:
    flash
    应用缓存
    音频和视频
    拖拽借口
    地理定位接口
    表单元素
    jquery常见用法
    jquery ajax 模板
    Ubuntu下Lucene环境搭配
    小絮叨
  • 原文地址:https://www.cnblogs.com/ruanqin/p/14147911.html
Copyright © 2011-2022 走看看