【问题标题】:python sending TCP/IP data instantlypython立即发送TCP/IP数据
【发布时间】:2016-10-16 00:05:50
【问题描述】:

我目前正在使用类似这样的方式在 myserver 中通过 TCP/IP 发送数据

for str in lst:
  data = str + "\n"
  self._conn.sendall(data)

现在假设我的列表中有以下两个字符串

1-This is statement 1 in list
2-This is statement 2 in list

我的客户正在收到这样的第 2 行的一半。

   This is statement 1 in list
   This is 

我想分别发送列表中的第 1 行和第 2 行。我了解 TCP/IP 以这种方式工作,它将发送可发送的全部数据。我想我可以在致电self._conn.sendall(data) 后推迟,但我想知道我还有哪些其他选择。我不能对数据的接收者进行更改,我只能对发送者进行更改。到目前为止,我唯一的选择是在每次发送后添加延迟。

【问题讨论】:

  • 客户端需要继续进行recv调用,直到它拥有一切。我对 Python 不熟悉,所以无法提供具体答案。
  • 如果您想完全控制每个数据包中发送的内容,还可以选择使用 UDP。

标签: python sockets tcp network-programming


【解决方案1】:

TCP 处理数据流,而不是单个数据包。这就像从文件中读取数据。发送方将数据放入其发送缓冲区,TCP 可以自行决定何时发送。到达接收应用程序的时间取决于数据的发送时间和(通常是不可预测的)网络条件。

如果您在套接字中使用TCP_NODELAY 标志(类似于socket.setsockopt(socket.IPPROTO_TCP, socket.TCP_NODELAY, 1)),则可以使TCP 传递更加可预测。这将导致TCP 在数据到达其缓冲区后立即发送出去。但是,仍然会有不能保证到达时间。这就是为什么任何基于时间的解决方案都会中断的原因,至少在某些情况下是这样。

解决方案是自己将数据流分成块。有几种方法可以做到这一点。以下是一些:

  1. 使用固定长度消息 - 如果所有消息都具有固定长度,则接收者只需 recv() 正确的字节数,处理消息,然后等待相同的字节数。

  2. 在每条消息之前发送消息的长度。如果要发送字符串“blah”,请将其编码为“0004blah”或类似的东西。接收器将(总是)读取前四个字节(即 0004)以计算出要读取的剩余字节数。然后它将读取所需的字节数,处理消息,然后等待下一个。这是一个功能强大且易于实施的解决方案。

  3. 使用分隔符。文本文件中的行由换行符 (\n) 分隔。同样,您可以在消息之间添加一个特殊的分隔符字节(或多个字节)。例如,您可以定义消息始终以美元符号 ($) 结尾。然后接收者要做的就是从套接字逐字节读取,直到它收到一个美元符号。当然,如果你采用这种方法,你必须确保消息的正文不包含分隔符。

【讨论】:

    【解决方案2】:

    TCP 基于流,而不是单个消息。所以需要自己解析每条消息的终点。在您的情况下,一个想法是阅读直到您获得换行符,然后处理该行。请注意,您可能会阅读以下内容:

    This is statement 1 in list
    This is 
    

    然后您需要检查是否有换行符,处理该行,然后让缓冲区准备好接收其余部分,如下所示:

    This is 
    

    【讨论】:

    • 你能给我举个例子吗?
    • @JamesFranco:当然:只需将最多 1000 个字符读入缓冲区即可。在换行符 ('\n') 上拆分缓冲区。解析前 N-1 个块(这些是完整的行)并保留最后一个块。然后继续阅读,追加到缓冲区并重复上述步骤。
    【解决方案3】:

    TCP 有一个本地缓冲区,直到它满了才会发送。您可以强制刷新本地缓冲区,以便在每条消息之后发送它,但是当对方收到这些包时,它们会存储在另一个本地缓冲区中,您的分离可能会消失。 TCP 是一个流,把它当作一个流来使用。您必须使用分隔符,并且当收到数据包时,您必须手动分隔消息。如果您想要更多控制,请使用 UDP 数据包。

    【讨论】:

      猜你喜欢
      • 2012-12-17
      • 2011-09-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-27
      • 2010-09-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多