Python 3.x Python套接字:如何在其他客户端中检测并列出服务器中连接的客户端,以及在客户端断开连接时如何更新它?

Python 3.x Python套接字:如何在其他客户端中检测并列出服务器中连接的客户端,以及在客户端断开连接时如何更新它?,python-3.x,sockets,Python 3.x,Sockets,我编写了一个服务器来接收多个客户机,它可以分别与客户机通信。在这里,我可以列出服务器中已连接的客户端,但当客户端断开连接时,它不会从服务器中删除客户端 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.

我编写了一个服务器来接收多个客户机,它可以分别与客户机通信。在这里,我可以列出服务器中已连接的客户端,但当客户端断开连接时,它不会从服务器中删除客户端

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) 当客户端与服务器断开连接时,还必须删除客户端,此更新的已连接客户端信息必须传递到所有当前连接的客户端

我已经通过以下答案进行了研究,但没有成功


我对服务器开发不太感兴趣,但这可能会有所帮助:

用于连接的\u客户端中的客户端:
已连接=str(已连接的客户端)
s、 发送(已连接。encode())
这可以根据要求进行,如:

data=s.recv(1024)
如果数据==:
#调用上面的代码。
要删除非活动用户,您可以执行以下操作:

whoLeft=s.recv(1024)
如果在已连接的\u客户端中离开:
已连接的\u客户端。删除(whoLeft)

您必须调整客户端,以便在断开连接之前发送其地址,否则就可以了。

希望这能帮助您:

    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),如果他不回答,这意味着它已断开连接,因此我们将其从列表中删除。对我来说,这就是工作,您只需要使用此函数经常更新列表