gpt4 book ai didi

戈朗 : TCP client/server data delimiter

转载 作者:IT王子 更新时间:2023-10-29 02:34:26 25 4
gpt4 key购买 nike

不确定如何表述这个问题,如果它真的只与 go 语言有关,但我想做的是拥有一个 tcp 服务器和客户端,它们将在两者之间交换数据,基本上客户端将流式传输大量的将数据分成更小的 block 发送给服务器,服务器将等待读取每个数据 block ,然后回复一个状态码,客户端将读取该状态码,并根据状态码进行其他工作。

我使用下面的函数作为测试 从客户端和服务器读取数据(请注意,我知道这并不完美,但这只是测试) :

func createBufferFromConn(conn net.Conn) *bytes.Buffer {
buffer := &bytes.Buffer{}
doBreak := false
for {
incoming := make([]byte, BUFFER_SIZE)

conn.SetReadDeadline(time.Now().Add(time.Second * 2))
bytesRead, err := conn.Read(incoming)
conn.SetReadDeadline(time.Time{})

if err != nil {
if err == io.EOF {
fmt.Println(err)
} else if neterr, ok := err.(net.Error); ok && neterr.Timeout() {
fmt.Println(err)
}
doBreak = true
}

if doBreak == false && bytesRead == 0 {
continue
}

if bytesRead > 0 {
buffer.Write(incoming[:bytesRead])
if bytes.HasSuffix(buffer.Bytes(), []byte("|")) {
bb := bytes.Trim(buffer.Bytes(), "|")
buffer.Reset()
buffer.Write(bb)
doBreak = true
}
}

if doBreak {
break
}
}
return buffer
}

现在在我的例子中,如果我通过 telnet 连接(go 代码还包括一个 client() 以连接到 server()),然后我输入类似 test 12345| 很公平,一切正常,缓冲区包含从 telnet 写入的所有字节(除了被 Trim() 调用删除的管道)。

如果我从代码中删除 if bytes.HasSuffix(buffer.Bytes(), []byte("|")) { block ,那么我将在 2 秒后再次超时,正如预期的那样,因为在这段时间内没有收到任何数据并且服务器关闭了连接,如果我不设置连接的读取截止日期,它将永远等待读取数据并且永远不知道何时停止。

我想我的问题是,如果我发送多个数据 block ,我是否必须指定一个我自己的分隔符,以便我知道何时停止从连接读取并避免永远等待或等待服务器超时连接?

最佳答案

I guess my question is, if i send multiple chunks of data, do i have to specify a delimiter of my own so that i know when to stop reading from the connection and avoid waiting forever or waiting for the server to timeout the connection

是的。 TCP 是一种流协议(protocol),如果不以某种方式对消息进行分帧,则无法确定协议(protocol)中消息的开始和停止位置。

一种更常用的成帧方法是发送大小前缀,这样接收方就知道要读取多少内容,不必缓冲结果并扫描分隔符。这可以像 message_length:data.... 一样简单(另请参阅 netstringtype-length-value 编码)。

关于戈朗 : TCP client/server data delimiter,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25766193/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com