Я пытаюсь создать чат с использованием библиотеки сокетов 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'))
Я действительно застрял на этом, но я довольно нов, когда имею дело с сокетами и сетью, и поэтому я, вероятно,совершить глупую ошибку!