2014-01-30 73 views
3

我想知道是否有方法可以告诉python等待,直到它从服务器获得响应才能继续运行。Python套接字等待

我正在写回合制游戏。我做了第一步,然后将移动发送到服务器,然后将服务器发送到另一台计算机。问题出现在这里。因为不再轮到我了,我希望我的游戏等待,直到它从服务器获得响应(等待另一个玩家移动)。但我的路线:

数据= self.sock.recv(1024)

挂起,因为(我认为)这是没有立即得到的东西。所以我想知道如何让它等待发生的事情,然后继续下去。

在此先感谢。

+0

“崩溃”?你有什么错误,追溯是什么? –

+0

那么,它冻结,并没有追踪。我必须强迫窗口关闭,然后它说:@A“进程退出代码为-805306369完成”。 – mapl93

回答

1

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

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

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

+3

'.recv'可能会返回'1024'字节少。 – jfs

1

socket programming howto是有关这个问题,特别是这部分:

现在我们就来插座的主要绊脚石 - send和recv的 网络缓冲区操作。它们不一定处理你交给它们的所有字节(或者期望从它们中获得 ),因为它们的主要焦点是处理网络缓冲区。通常,当关联的网络缓冲区已被填充(发送)或清空(recv)时,它们将返回 。然后他们会告诉你他们处理了多少个字节。您有责任再次打电话给他们 ,直到您的信息完全处理完毕。

...

一个复杂需要注意的:如果你的会话协议允许多个 消息发送背靠背(不含某种回复),并传递一个recv的任意 块大小,您最终可能会阅读以下消息的开头。你需要把它放在一边>并坚持下去,直到需要它为止。

因为它的长度(比如说5个数字字符)的前缀会变得更加复杂,因为(不管你信不信),你可能不会在一个recv中得到全部5个字符。在玩 左右,你会摆脱它;但是在高网络负载下,您的代码将非常快速地中断,除非您使用两个recv循环 - 第一个确定长度,第二个到 获取消息的数据部分。讨厌。这也是当你发现发送 并不总是设法摆脱一切通过。尽管已经阅读了 这个,你最终还是会得到它的!

从这个主要的外卖店:

  • 你需要建立一个固定的消息大小,或者你需要在的开始发送消息的大小消息

    调用socket.recv时
  • ,通过你真正想要的字节数(我猜你不会真的想1024个字节)。然后使用LOOP,因为您无法保证在一次通话中获得所有您想要的。