golang socket tcp 长连接通讯中数据包读取在包头增加数据包长度。

普通 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
}

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注