Сокеты Python: Обработка клиентского разъединения - PullRequest
0 голосов
/ 17 марта 2019

Я пытаюсь создать чат с использованием библиотеки сокетов Python, и последняя ошибка, которую я просто не могу понять, как ее решить.

Ниже приведен код для сервера и клиента.Все отображение и ввод данных для клиентского класса осуществляется через другой скрипт, который имеет дело с другими функциями и графическим интерфейсом.Этот скрипт предназначен только для обработки сервером.

Проблема в том, что когда клиент отключается, сервер выдает ошибку и вылетает.Единственный способ снова запустить сервер - принудительно закрыть командную строку и снова найти скрипт.Это, конечно, довольно серьезная проблема.

Ошибка, полученная на сервере:

Traceback (most recent call last):
  File "C:\Users\jamie\AppData\Local\Programs\Python\Python36- 32\lib\threading.py", line 916, in _bootstrap_inner
     self.run()
  File "C:\Users\jamie\AppData\Local\Programs\Python\Python36-32\lib\threading.py", line 864, in run
     self._target(*self._args, **self._kwargs)
  File "C:\Users\jamie\Documents\Programming\Python\wxPython\ChatRoom\chatroom.py", line 15, in handler
     data = c.recv(1024)
  ConnectionResetError: [WinError 10054] An existing connection was forcibly closed by the remote host

Код для моего сервера.Я не включил свой графический интерфейс и основной скрипт, так как ошибка исходит только от сервера.

import socket
import threading

class Server:
    sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    connections = []
    port = 9000

    def __init__(self):
        self.sock.bind(('0.0.0.0', self.port))
        self.sock.listen(1)

    def handler(self, c, a):
        while True:
            data = c.recv(1024)
            for connection in self.connections:
                connection.send(data)
            if not data:
                print(str(a[0]) + ':' + str(a[1]) + ' disconnected.')
                self.connections.remove(c)
                c.close()
                break

    def run(self):
        while True:
            c, a = self.sock.accept()
            cThread = threading.Thread(target=self.handler, args=(c,a))
            cThread.daemon = True
            cThread.start()
            self.connections.append(c)
            print(str(a[0]) + ':' + str(a[1]) + ' connected.')

class Client:
    sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

    def sendMsg(self, msg):
        self.sock.send(bytes(msg, 'utf-8'))

    def __init__(self, address, port, mw):
        self.mw = mw
        self.sock.connect((address, port))

        rThread = threading.Thread(target=self.reciever)
        rThread.daemon = True
        rThread.start()

    def reciever(self):
        while True:
            data = self.sock.recv(1024)
            if not data:
                break
            self.mw.MessageRecieved(str(data, 'utf-8'))

Я действительно застрял на этом, но я довольно нов, когда имею дело с сокетами и сетью, и поэтому я, вероятно,совершить глупую ошибку!

...