Я делаю простой сервер и клиент с сокетами Python, и мне было интересно, как я могу справиться с отключением. Каждый раз, когда один из моих клиентов отключается, он выдает ConnectionResetError: [WinError 10054] An existing connection was forcibly closed by the remote host и сервер перестает работать. В этом есть смысл, но как я могу справиться с таким отключением? Вот мой серверный код: (я знаю, что это беспорядочный мой первый проект сокета)

import socket
import threading


s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) #Connection oriented, IPV4

s.bind((socket.gethostname(), 1234))#Ip address information, port
s.listen(5)

connections = [] #Connection added to this list every time a client connects

def accptconnection():
    while True:
        clientsocket, address = s.accept()
        connections.append(clientsocket) #adds the clients information to the connections array
        threading.Thread(target=recvmsg, args=(clientsocket, address,)).start()

def recvmsg(clientsocket, address):
    while True:
        print(f"Connection from {address} has been established.")
        msg = clientsocket.recv(1024)
        if len(msg.decode('utf-8')) > 0:
            print(msg.decode("utf-8"))
        for connection in connections: #iterates through the connections array and sends message to each one
            msgbreak = msg
            connection.send(bytes(str(msgbreak.decode("utf-8")), "utf-8"))


accptconnection()

Заранее спасибо, если поможете!

0
HoneyPoop 29 Ноя 2020 в 09:53

1 ответ

Лучший ответ

Это должно предотвратить закрытие сервера и очистить клиентов, с которыми у вас возникла ошибка соединения:

import socket
import threading


s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) #Connection oriented, IPV4

s.bind((socket.gethostname(), 1234))#Ip address information, port
s.listen(5)

connections = [] #Connection added to this list every time a client connects

def accptconnection():
    while True:
        clientsocket, address = s.accept()
        connections.append(clientsocket) #adds the clients information to the connections array
        threading.Thread(target=recvmsg, args=(clientsocket, address,)).start()

def recvmsg(clientsocket, address):
    print(f"Connection from {address} has been established.")
    while True:
        try:
            msg = clientsocket.recv(1024)
        except ConnectionError:
            print(f"Connection from {address} has been lost.")
            if clientsocket in connections:
                connections.remove(clientsocket)
            return
        if len(msg.decode('utf-8')) > 0:
            print(msg.decode("utf-8"))
        for connection in connections: #iterates through the connections array and sends message to each one
            msgbreak = msg
            try:
                connection.send(bytes(str(msgbreak.decode("utf-8")), "utf-8"))
            except ConnectionError:
                 print(f"Unable to reach client with socket {connection}")
                 if connection in connections:
                     connections.remove(connection)

accptconnection()
1
Shar 29 Ноя 2020 в 07:41