Python Socket: how to detect and list connected clients in server in the other clients and how to update it when a client disconnected?
我写了一个服务器来接收多个客户端,它可以分别与客户端通信。在这里我可以列出服务器中连接的客户端,但是当客户端断开连接时,它不会从服务器中删除客户端。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 | Server.py import socket from threading import Thread s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) ip = '0.0.0.0' port = 4141 s.bind((ip, port)) s.listen(5) connected_clients=[] def handle_client(c, addr): while True: try: message = input("You:") message = message.encode("ascii") c.send(message) except: print("Disconnected for sending..") reply = c.recv(4141) if not reply: print("Disconnected for receiving..") else: reply = reply.decode('ascii') print("Other :", reply) while True: c, addr = s.accept() # print('Connected:', addr) connected_clients.append(addr[0]) print(connected_clients) t = Thread(target=handle_client, args=(c, addr)) t.setDaemon(True) t.start() Client.py import socket s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) port = 4141 ip = input('Enter the IP Address::') s.connect((ip, port)) while True: message = input("You:") message = message.encode("ascii") s.send(message) reply = s.recv(4141) reply = reply.decode('ascii') print("Other :", reply) s.close() |
1)列出服务器中连接的客户端和其他客户端(每个客户端都需要列出服务器中当前处于活动状态的所有客户端)
2) 还必须在与服务器断开连接时删除客户端,此更新的连接客户端信息必须传递给所有当前连接的客户端。
我通过以下答案进行了研究,但没有成功。
第一
第二
第三
希望对你有帮助:
1 2 3 4 5 6 7 8 9 10 11 12 | def check_connections(self): """ Check if the client(s) are/is still connected""" for i, connection in enumerate(self.all_connections): try: connection.send(b'PING') data = connection.recv(1024) if len(data) == 0: del self.all_connections[i] del self.all_addresses[i] except ConnectionError: del self.all_connections[i] del self.all_addresses[i] |
这是一个检查连接的功能,如果他没有回答,客户端必须回答一些东西(对我来说PING),这意味着它已断开连接,所以我们将其从列表中删除。对我来说,这是工作,你只需要经常使用此功能更新列表。
我不太喜欢服务器开发,但这可能会有所帮助:
1 2 3 | for client in connected_clients: connected=str(connected_clients) s.send(connected.encode()) |
这可以根据要求完成,例如:
1 2 3 | data = s.recv(1024) if data == <command name here as string>: #Call the code above. |
要删除不活跃的用户,你可以这样做:
1 2 3 | whoLeft = s.recv(1024) if whoLeft in connected_clients: connected_clients.remove(whoLeft) |
您必须调整客户端,以便在断开连接之前发送其地址,否则应该没问题。