簡體   English   中英

Python套接字,如何擺脫無限循環和處理異常

[英]Python sockets, how to escape from infinite loop and handle exceptions

我有一個連接到遠程服務器的腳本。 代碼如下

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((remote_host,remote_port))
s.setblocking(False)


while True:
    try:
        data = s.recv(1024)

        if not data:
           break

        pkt_type = ord(data[2]) # get pkt type

        if pkt_type == Reset:
           s.send(data)

        if pkt_type == Authenticate:
           processAuthenticate(s,data)
           break

    except:
        pass

while(True)
 .
 .
 .

我等待重置並回顯到服務器,然后等待Authenticate數據包,然后旋轉幾下,然后將其回顯到服務器。 成功完成此操作后,我現在可以從服務器請求數據。 這是在下一個while(true)循環中完成的。

這是這樣做的最好方法。 有時,當我運行腳本時遇到錯誤,處理異常並阻止執行下一個wile循環的最簡單方法是什么?

謝謝

有限狀態機(FSM)幾乎是執行此類操作的規范方法。 在Python中執行FSM的一個很好的參考是: http : //wiki.python.org/moin/FiniteStateMachine

編輯: 看起來FSM應該在這里很方便。

實際上,我建議您看一下Twisted Reactor-尚未親自使用過,但它可以完成所有繁瑣的工作和令人討厭的工作,而如果使用FSM和事件循環,則需要自己實施while -loop本質上是)

編輯2:

一些注意事項(在等待您的完整代碼時)

  1. 您連續有2個while(true)的事實很奇怪
  2. 您可能想將except:語句上移至if not data語句之前,並用continue替換pass
  3. ord(data[2])建議您使用的是二進制協議,您實際上應該考慮使用struct模塊unpack()pack()代替。

除了上述提示之外,您還需要緩沖數據-使用流協議時,您不能僅僅假設一次調用recv就可以獲取所有想要的數據。 相反,您必須將您從recv讀取的內容添加到緩沖區中,然后檢查緩沖區以查看其是否包含消息的所有數據。 如果是這樣,請提取消息,進行處理,然后對其余緩沖區重復上述操作。 當您無法提取更多消息時,請返回並從套接字中閱讀更多內容。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM