Python套接字等待

时间:2014-01-30 02:51:37

标签: python sockets pygame

我想知道是否有一种方法可以让python等到它从服务器获得响应以继续运行。

我正在写一个回合制游戏。我做了第一步,它将移动发送到服务器,然后将服务器发送到另一台计算机。这个问题来了。由于轮到我不再希望我的游戏等到它从服务器得到响应(等到其他玩家移动)。但我的界限:

数据= self.sock.recv(1024)

挂起因为(我认为)它没有立即获得某些东西。所以我想知道如何让它等待事情发生然后继续前进。

提前致谢。

2 个答案:

答案 0 :(得分:2)

该行sock.recv(1024)阻塞,直到收到1024字节或OS检测到套接字错误。您需要一些方法来了解消息大小 - 这就是HTTP消息包含Content-Length的原因。

如果预期的字节数在超时之前没有到达,您可以设置socket.settimeout超时以完全中止读取。

您还可以使用setblocking(0)探索Python的非阻塞套接字。

答案 1 :(得分:2)

socket programming howto与此问题相关,特别是此部分:

  

现在我们来到套接字的主要绊脚石 - 发送和接收操作   网络缓冲区。它们不一定处理你提供的所有字节(或期望   从他们),因为他们的主要重点是处理网络缓冲区。一般来说,他们   当关联的网络缓冲区已填满(发送)或清空(recv)时返回。   然后他们告诉你他们处理了多少字节。打电话给他们是你的责任   再次,直到你的信息被完全处理。

     

...

     

要注意的一个复杂因素:如果您的会话协议允许多个   消息要发送回去(没有某种回复),你通过recv an   任意块大小,您可能最终阅读以下消息的开头。你会   需要把它放在一边>并抓住它,直到它需要为止。

     

使用它的长度(例如,作为5个数字字符)对邮件进行前缀变得更复杂,   因为(信不信由你),你可能无法在一次recv中获得所有5个字符。在比赛中   在你周围,你会逃脱它;但在高网络负载下,您的代码将非常快   断开,除非你使用两个recv循环 - 第一个确定长度,第二个确定   获取消息的数据部分。讨厌。这也是你发现发送的时候   并不总是设法一次性摆脱一切。尽管已经阅读过   这个,你最终会得到它!

这方面的主要内容是:

  • 您需要建立FIXED邮件大小,或者您需要在邮件开头发送邮件大小

  • 调用socket.recv时,传递你真正想要的字节数(我猜你实际上并不想要1024字节)。然后使用LOOP,因为您不能保证在一次通话中得到您想要的一切。

相关问题