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 }