【问题标题】:How to properly use recv function for TCP chat, python3?如何正确使用recv函数进行TCP聊天,python3?
【发布时间】:2021-09-04 06:56:29
【问题描述】:

一些消息来源说 recv 应该具有消息的最大可能长度,例如 recv(1024)

message0 = str(client.recv(1024).decode('utf-8'))

但其他消息来源说它应该包含接收消息的总字节数。如果消息是“你好”:

message0 = str(client.recv(5).decode('utf-8'))

recv()的正确使用方法是什么?

【问题讨论】:

    标签: python-3.x sockets


    【解决方案1】:

    一些消息来源说......但其他消息来源说......消息......

    两个来源都是错误的。

    recv 的参数是一次要读取的最大字节数

    使用 UDP 套接字,这是 消息大小 想要读取 或更大,但单个 recv 只会返回一个无论如何,单个消息。如果给定的大小小于消息,它将被修剪,其余的将被丢弃。

    对于 TCP 套接字(您询问的情况),首先没有消息的概念,因为 TCP 只是一个字节流。 recv 将简单地返回 可用字节数 供读取,直到给定大小。具体来说,TCP 接收器中的单个recv 不需要匹配发送器中的单个send。如果数据量很小,它可能会匹配,并且通常会匹配,但不能保证,永远不要依赖它。

    ... message0 = str(client.recv(5).decode('utf-8'))

    请注意,直接对recv 返回的数据调用decode('utf-8') 是个坏主意。首先需要确保读取了所有预期的数据,然后才调用decode('utf-8')。如果只读取部分数据,则读取数据的结尾可能位于字符中间,因为 UTF-8 中的单个字符可能会被编码为多个字节(ASCII 字符除外)。如果使用不完整的编码字符调用decode('utf-8'),它将引发异常并且您的代码将中断。

    【讨论】:

    • 现在我很困惑 recv 是如何工作的,因为我的两种解释都是错误的。谢谢,我会搜索更多关于 recv 以及它如何在 TCP 上工作的信息,因为你的回答(以一种好的方式)对我来说是先进的。
    • @g_odim_3:假设 TCP 具有消息语义并由此推导出收件人中的 recv 与发件人中的 send 匹配,不幸的是,这是一个非常常见的错误。悲剧的是。它通常似乎工作,然后看似工作的代码被交付。然后,对于某些客户来说,它会意外失败并且随机失败(内存压力、网络不稳定、由于使用 VPN 导致的不同 MTU ......),没有人知道为什么。
    • 它发生在我的代码中。您从哪里了解套接字的?它可以帮助我掌握这些函数和套接字的基本原理。
    • @g_odim_3: “你从哪里了解到套接字的?” - 没什么特别的。只需多年的经验。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-16
    • 1970-01-01
    相关资源
    最近更新 更多