【问题标题】:Get full response from client in a TCP server (Python)在 TCP 服务器 (Python) 中从客户端获取完整响应
【发布时间】:2018-10-12 04:35:39
【问题描述】:

作为 tcp 服务器,我如何从客户端获取完整响应?

当我是客户时,我只是这样做:

server_response = b''
buffer = s.recv(BUFFER_SIZE)
while buffer:
    server_response += buffer
    buffer = s.recv(BUFFER_SIZE)

但作为我的服务器,我不能这样做,因为 recv 是一个阻塞调用

协议没有定义消息的大小,但它通常是一些长度可变的文本,有时是长度可变的文本和包含大小的文件中的二进制数据。它定义了一个标记,即 \n。当找到 \n 时,消息结束

【问题讨论】:

    标签: python tcp


    【解决方案1】:

    作为 tcp 服务器,我如何从客户端获取完整响应?

    TCP 是一种流协议,没有固有的消息边界。这意味着没有“完整响应”之类的东西,除非您现在预先确定长度或有某种标记来检测消息的结束或消息以 TCP 连接的结束而结束。

    ...协议没有定义消息大小。

    所以没有预先知道长度。那么你需要一种标记。

    ...但它通常是一些可变长度的文本,有时是可变长度的文本和包含大小的文件中的二进制数据

    二进制和文本之间没有明确的区别,因为二进制只是意味着一个字节可以取任何值,因此文本也是某种二进制。因此,您需要一个清晰的标记,文本结束的地方(可能是一些 \0 字符或换行符)。此外,size is included 对于二进制部分并没有明确定义如何准确包含大小。通常使用不同的变体,例如作为二进制(uint16,uint32 ...)的固定大小的前缀,带有新行的十六进制值(如在HTTP分块编码中),十进制值...

    一旦您对消息的外观有了清晰明确的定义,您就应该能够在消息解析器中实现此定义。由于您当前的描述没有提供这种清晰性,因此无法在实施中提供进一步的帮助。

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-01-05
    • 2015-05-11
    • 2018-12-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-03
    相关资源
    最近更新 更多