作为tcp服务器,我如何从客户端获得完整响应?
当我是客户时,我只是做:
server_response = b''
buffer = s.recv(BUFFER_SIZE)
while buffer:
server_response += buffer
buffer = s.recv(BUFFER_SIZE)
但是当我服务器时,由于recv是一个阻塞调用,所以我不能这样做
协议没有定义消息的大小,但是通常是一些长度可变的文本,有时是长度可变的文本和包含大小的文件中的二进制数据。它定义一个标记,它是\ n。找到\ n消息结束后
答案 0 :(得分:0)
作为TCP服务器,我如何从客户端获得完整响应?
TCP是没有固有消息边界的流协议。这意味着没有“完全响应”之类的东西,除非您现在预先确定长度或具有某种标记来检测消息的结尾或消息以TCP连接的结尾结束。
...协议未定义消息大小。
因此没有长度是预先知道的。然后,您需要一种标记。
...但是它通常是一些长度可变的文本,有时是长度可变的文本以及包含大小的文件中的二进制数据
二进制和文本之间没有明显的区别,因为二进制仅表示字节可以取任何值,因此文本也是某种二进制。因此,您需要在文本结束处使用清晰的标记(可能是一些\0
字符或换行符)。另外, size 是包含的,因为二进制部分并不清楚如何精确包含大小。通常使用不同的变体,例如固定大小的前缀(如二进制(uint16,uint32 ...),带有换行符的十六进制值(如HTTP分块编码),十进制值...
一旦您对消息的外观有了清晰明确的定义,就应该能够在消息解析器中实现此定义。由于您当前的描述尚不清楚,因此无法在实施过程中提供进一步的帮助。