Python Socket: как обнаружить и перечислить подключенных клиентов на сервере в других клиентах и ​​как обновить его, когда клиент отключен? - PullRequest
0 голосов
/ 12 февраля 2019

Я написал сервер для приема нескольких клиентов, и он может общаться с клиентами отдельно.Здесь я могу перечислить подключенных клиентов на сервере, но он не удаляет клиентов с сервера, когда клиент отключен.

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-й

1 Ответ

0 голосов
/ 27 мая 2019

Я не так много занимаюсь разработкой серверов, но это может помочь:

for client in connected_clients:
    connected=str(connected_clients)
    s.send(connected.encode())

Это можно сделать по запросу, например:

data = s.recv(1024)
if data == <command name here as string>:
    #Call the code above.

Для удаления неактивных пользователей,Вы можете сделать:

whoLeft = s.recv(1024)
if whoLeft in connected_clients:
    connected_clients.remove(whoLeft)

Вам придется настроить клиент так, чтобы перед отключением он отправлял свой адрес, но в противном случае это должно быть хорошо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...