我想知道是否有一种方法可以让python等到它从服务器获得响应以继续运行。
我正在写一个回合制游戏。我做了第一步,它将移动发送到服务器,然后将服务器发送到另一台计算机。这个问题来了。由于轮到我不再希望我的游戏等到它从服务器得到响应(等到其他玩家移动)。但我的界限:
数据= self.sock.recv(1024)
挂起因为(我认为)它没有立即获得某些东西。所以我想知道如何让它等待事情发生然后继续前进。
提前致谢。
答案 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,因为您不能保证在一次通话中得到您想要的一切。