golang 處理TCP粘包問題

func Encode(data []byte) []byte {
	buf := bytes.NewBuffer(nil)
	binary.Write(buf, binary.BigEndian, uint32(len(data)))
	binary.Write(buf, binary.BigEndian, data)
	return buf.Bytes()
}

func Decode(data []byte) ([]byte, error) {
	reader := bufio.NewReader(bytes.NewBuffer(data))
	peek, err := reader.Peek(4)
	if err != nil {
		return nil, err
	}
	buffer := bytes.NewBuffer(peek)
	var length uint32
	err = binary.Read(buffer, binary.LittleEndian, &length)
	if err != nil {
		return nil, err
	}
	if uint32(reader.Buffered()) < length+4 {
		return nil, errors.New("長度不足")
	}
	data = make([]byte, length+4)
	_, err = reader.Read(data)
	if err != nil {
		return nil, err
	}
	return data[4:], nil
}

  

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章