Python Socket:如何在其他客户端中检测和列出服务器中连接的客户端以及如何在客户端断开连接时更新它?

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)

您必须调整客户端,以便在断开连接之前发送其地址,否则应该没问题。