zinx icon indicating copy to clipboard operation
zinx copied to clipboard

一个包2次IO, 优化方案:一次性读取然后对其进行粘包处理

Open gocpp opened this issue 5 years ago • 2 comments

// 创建拆包解包的对象
		dp := NewDataPack()

		//读取客户端的Msg head
		headData := make([]byte, dp.GetHeadLen())
		if _, err := io.ReadFull(c.Conn, headData); err != nil {
			fmt.Println("read msg head error ", err)
			break
		}
		//fmt.Printf("read headData %+v\n", headData)

		//拆包,得到msgid 和 datalen 放在msg中
		msg, err := dp.Unpack(headData)
		if err != nil {
			fmt.Println("unpack error ", err)
			break
		}

		//根据 dataLen 读取 data,放在msg.Data中
		var data []byte
		if msg.GetDataLen() > 0 {
			data = make([]byte, msg.GetDataLen())
			if _, err := io.ReadFull(c.Conn, data); err != nil {
				fmt.Println("read msg data error ", err)
				break
			}
		}
		msg.SetData(data)

gocpp avatar May 14 '20 06:05 gocpp

ok,可以提PR哦~

aceld avatar Jun 18 '20 09:06 aceld

不知道包长 没法一次性读出吧

sirodeneko avatar May 23 '21 13:05 sirodeneko