這段代碼在連接客戶端的不同執行緒上運行。當客戶端斷開連接時,try-except 塊應該引發例外,并將客戶端從客戶端串列中洗掉(connectClients 也是一個串列,我使用它來防止在迭代程序中可迭代的大小發生變化時發生的錯誤) . 之后,它應該繼續回圈并將訊息發送到下一個客戶端(如果它們仍然連接),但這不會發生,回圈只是停止。在顯示“A client has disconnected”并在引發例外的客戶端之前將訊息發送給串列中的所有客戶端后,它再次正常作業。
def communicateServer(self, msg):
# Add try except to remove connections
self.connectedClients = self.clients
i = 0
for client in self.clients:
try:
client.send(msg)
print("Sending message...")
i = 1
except:
print("A client has disconnected")
self.connectedClients.pop(i)
i = 1
continue
self.clients = self.connectedClients
我已經嘗試過continue和pass,期望回圈進入下一次迭代,但它沒有作業。回圈仍然停止。請注意,我不會從正在迭代的串列中洗掉專案(客戶端)。是的,我知道我可以在這段代碼中使用 enumerate(),但由于串列的元素是套接字連接,Python 將其理解為關鍵字引數,并且不允許使用 enumerate。
uj5u.com熱心網友回復:
我不會從我正在迭代的串列中洗掉專案(客戶)
但是你實際上洗掉了它們,self.connectedClients = self.clients你正在創建一個對的參考self.clients(所以你正在修改同一個物件),所以你需要一個新串列:
self.connectedClients = self.clients.copy()
如果您將使用 enumerate (這可能比復制足夠大的串列更有效),我也看不到問題,如下所示:
for index, client in enumerate(self.clients):
如果您在使用列舉時遇到錯誤,請提供更多詳細資訊
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/527943.html
下一篇:如何在字串中查找重復項
