普通 socket读取的时候一般是判断EOF标志,但是长连接使用这个标志就不行了。
这里就只能增加特殊符号作为标识符,但是特殊符号有弊端,如果你发送的内容中有这个字符,数据包就会被截断,无法读取完整数据包。所以最好的方式还是在发送的时候在包头添加内容长度,方便接收端读取。
下面是例子。
发送部分:
//写入包头
datalen := uint64(len(senddata)) //获取包大小
err := binary.Write(conn, binary.BigEndian, datalen) //写入包头
if err != nil {
fmt.Println(err)
return
}
//发送包体
if _, err := conn.Write([]byte(senddata)); err != nil {
print(“Write err:”, err)
}
读取部分:
func connReadAll(conn net.Conn) ([]byte, error) {
// 读取包头
var datalen uint64
err := binary.Read(conn, binary.BigEndian, &datalen)
if err != nil {
return nil, err
}
//读取包体
var body bytes.Buffer
buf := make([]byte, 1024)
bodylen := 0
for {
n, err := conn.Read(buf)
if n == 0 {
return nil, errors.New(“read is null”)
}
if err != nil {
if err != io.EOF {
log(“read error:”, err)
return nil, err
}
break
}
body.Write(buf[:n])
bodylen += n
if uint64(bodylen) == datalen { //长度一致,跳出读取
break
}
}
return body.Bytes(), nil
}