2014-01-30 74 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,因爲您無法保證在一次通話中獲得所有您想要的。