不知道如何表达这个问题,以及它是否真的只与go语言有关,但是我想做的是让tcp服务器和客户端之间进行数据交换,基本上,客户端会将大量数据流化为较小的数据如果将数据块发送给服务器,则服务器将等待读取每个数据块,然后回复状态码,客户端将读取该状态码,并根据此状态码执行其他工作。

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

现在,在我的情况下,如果我通过telnet连接(go代码还包括一个client()以连接到server()),并且我键入了类似test 12345|的名称,则说明一切正常,并且缓冲区包含从中写入的所有字节telnet(通过Trim()调用删除的管道除外)。

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

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


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是一种流协议,如果不对消息进行某种形式的构架,就无法确定协议中消息的开始和停止位置。

使用的更常见的成帧方法是发送大小前缀,以便接收器无需缓冲结果并扫描定界符即可知道要读取多少内容。 这可以像message_length:data....一样简单(另请参见netstring和类型长度值编码)。