1 回答

TA貢獻1815條經驗 獲得超6個贊
你的問題很簡單。
您的客戶端連接到服務器
服務器正在創建一個無限循環的新線程
服務器發送一條簡單的消息
客戶端收到消息
客戶端默認關閉連接(!!!),因為您從其方法返回(不再引用)
服務器嘗試接收消息,然后繼續(錯誤就在這里)
由于連接已被客戶端關閉,因此服務器無法在循環內發送或接收下一條消息,因為它是無限的。這就是錯誤的原因!此外,在關閉連接的情況下沒有錯誤處理,也沒有用于在每一端關閉的協議。
如果您需要一個檢查服務器是否在線的函數,您應該創建一個函數(但我確信一個簡單的連接就足夠了),其工作原理類似于 ping。例子:
客戶端功能:
def isOpen(self, ip, port):
? ? s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
? ? try:
? ? ? ? s.connect((str(ip), int(port)))
? ? ? ? s.send("ping".encode('utf-8'))
? ? ? ? return s.recv(1024).decode('utf-8') == "pong" # return whether the response match or not
? ? except:
? ? ? ? return False # cant connect
服務器功能:
def clientthread(conn):
? ? while True:
? ? ? ? msg = conn.recv(1024).decode('utf-8') #receiving a message
? ? ? ? if msg == "ping":
? ? ? ? ? ? conn.send("pong".encode('utf-8')) # sending the response
? ? ? ? ? ? conn.close() # closing the connection on both sides
? ? ? ? ? ? break # since we only need to check whether the server is online, we break
從您之前的問題中,我可以告訴您在理解 TCP套接字通信的工作原理方面存在一些問題。請花點時間閱讀一些有關如何通過套接字進行通信的文章。如果您不需要實時通信(連續數據流,如視頻、游戲服務器等),僅需要登錄表單,請堅持使用眾所周知的協議,如 HTTP。如果您剛剛開始套接字編程,創建自己的可靠協議可能會有點復雜。
您可以使用Flask作為 HTTP 后端。
添加回答
舉報