github.com/qiuhoude/go-web@v0.0.0-20220223060959-ab545e78f20d/proto/v2/pcodec/pack_test.go (about)

     1  package pcodec
     2  
     3  import (
     4  	"bufio"
     5  	"bytes"
     6  	"encoding/binary"
     7  	"log"
     8  	"testing"
     9  	"time"
    10  )
    11  
    12  func TestPack(t *testing.T) {
    13  	msg := []byte("现在时间是:" + time.Now().Format("2006-01-02 15:04:05"))
    14  	pack := &Package{
    15  		Length: int32(len(msg)),
    16  		PbMsg:  msg,
    17  	}
    18  
    19  	buf := new(bytes.Buffer)
    20  	// 写入四次,模拟TCP粘包效果
    21  	pack.Pack(buf)
    22  	buf.Write([]byte("213213")) // 模拟个错误数据包
    23  	pack.Pack(buf)
    24  	pack.Pack(buf)
    25  	pack.Pack(buf)
    26  
    27  	// 使用scanner的方式
    28  	/*scanner := bufio.NewScanner(buf)
    29  	scanner.Split(ScanPBMsg)
    30  	for scanner.Scan() {
    31  		scannedPack := new(Package)
    32  		scannedPack.Unpack(bytes.NewReader(scanner.Bytes()))
    33  		log.Printf("%d,%s", scannedPack.Length, scannedPack.PbMsg)
    34  	}
    35  	if err := scanner.Err(); err != nil {
    36  		log.Fatal("无效数据包")
    37  	}*/
    38  	const (
    39  		maxSize = int32(140000)
    40  	)
    41  	reader := bufio.NewReader(buf)
    42  	for reader.Size() > 0 {
    43  		lengthByte, err := reader.Peek(4)
    44  		if err != nil {
    45  			break
    46  		}
    47  		lengthBuff := bytes.NewBuffer(lengthByte)
    48  		var length int32
    49  		err = binary.Read(lengthBuff, binary.BigEndian, &length)
    50  		if err != nil {
    51  			break
    52  		}
    53  		if length > maxSize || length < 0 { //说明是错误数据调过1字节
    54  			reader.Discard(1)
    55  			continue
    56  		}
    57  		packBytes := make([]byte, int32(length+4))
    58  		reader.Read(packBytes)
    59  		pack := new(Package)
    60  		pack.Unpack(bytes.NewReader(packBytes))
    61  		log.Printf("%d,%s", pack.Length, pack.PbMsg)
    62  	}
    63  
    64  }