我有以下 Socket Server 可以在 Raspberry 中運行。
我可以連接到它,發送命令,它會回復命令。
現在我希望當我發送命令時RESET,Socket 斷開連接,Raspberry 回傳到 Listening 狀態,接受新連接。
但是,似乎該地址未正確釋放,并且作業系統引發“地址已在使用”例外。
Reconnecting....
OSError: [Errno 98] Address already in use
import socket
class SocketController:
def __init__(self):
self.s = None
self.conn = None
self.address = None
def connect(self):
host = ''
port = 5560
self.s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
self.s.bind((host, port))
self.s.listen(1)
self.conn, self.address = self.s.accept()
def disconnect(self):
self.conn.close()
self.s.close()
def rx(self):
data = self.conn.recv(1024).decode('utf-8')
if data == "RESET":
self.disconnect()
print("Reconnecting....")
self.connect()
else:
self.conn.sendall(str.encode(data))
if __name__ == '__main__':
s = SocketController()
s.connect()
while True:
rxData = s.rx()
關閉連接并重新開始收聽的正確方法是什么?
uj5u.com熱心網友回復:
您應該告訴重用套接字,因為它被標記為已使用,直到您處理結束。
您可以通過在創建套接字之后和之前添加它來輕松地做到這一點bind:
self.s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
您可以在此評論中找到完整的解釋
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/405109.html
標籤:
