【问题标题】:Socket in python and socket.recv()python中的套接字和socket.recv()
【发布时间】:2015-06-25 18:05:21
【问题描述】:

我正在从服务器向我的客户端发送一些请求,但我遇到了一些问题。

当我向客户端发送消息时,如果我发送了许多消息,我将通过 socket.recv()

全部接收

是否有一种方法可以逐条获取消息?

谢谢

【问题讨论】:

  • 在 recv 中你是否尝试过传递 size 参数。以字节为单位告知要接收的消息的大小
  • @csharpcoder 这没有有帮助,套接字的流性质可能仍会以不同大小分割传入的数据。
  • 是的,我当然可以,但我事先不知道我必须接收多少字节;)
  • 您可能希望阅读 whathaveyoutried.com 并向 StackOverflow 社区表示敬意,该社区强烈鼓励发布高质量的问题以及 MCVE(a Minimum-Complete-Verifiable-Example of code ) 显示到目前为止您已经尝试过的内容。您可能想要更新您的帖子,以达到最低合理的质量水平并表明您尊重其他 StackOverflow 贡献成员的意愿。他们是喜欢回答有关 MCVE 相关问题的好问题的专业人士。 享受成为 StackOverflow 贡献成员并支持此社区网络礼仪

标签: python sockets recv


【解决方案1】:

您需要在其他裸套接字上使用某种协议。

查看 python twisted 或使用类似 nanomsgZeroMQ 如果你想要一个简单的替代是面向消息的。

但它不是与传输无关,这意味着它们只有在两端都使用时才能工作。

【讨论】:

    【解决方案2】:

    没有。 TCP 是一个字节流。没有大于一字节的消息。

    【讨论】:

      【解决方案3】:

      我假设您正在使用 TCP。 TCP 是流协议,而不是数据报协议。这意味着数据不是一系列消息,而是没有任何消息边界的单个数据流。如果您需要类似的东西,请切换协议(UDP 是数据报,但有其他问题)或在知道消息的 TCP 之上创建自己的协议。 基于 TCP 的典型基于消息的协议要么使用一些消息分隔符(通常是换行符),要么在每条消息前面加上其大小。

      【讨论】:

      • 感谢您的回答。那么,网络游戏例如使用UDP而不是TCP?
      • 另外,你写的其他问题是什么?
      • UDP 用于消息的性质允许丢失和重新排序的信息(例如,带有时间戳的永久控制器更新消息),或者在其之上使用一层来确保消息到达。所以——游戏经常使用它,但并非总是如此。这不取决于用例。
      • 好的。例如,我正在尝试进行聊天,那么您认为 UDP 是不错的选择吗?
      • @Xavier59:如果您认为聊天消息会丢失或重复,那么您可以使用 UDP。
      猜你喜欢
      • 1970-01-01
      • 2018-03-02
      • 2015-08-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多