我正在尝试在python上建立小型聊天室,而当我尝试在QTextEdit上显示或显示客户的消息时,在此行之后client_socket,client_address = server_socket.accept()
完整代码:
from PyQt5 import uic
from PyQt5.QtWidgets import QApplication,QWidget,QMainWindow
from PyQt5.QtCore import QThread,pyqtSignal
import socket,errno,sys,time
from threading import Thread as thr
import gc; gc.collect()
f = open('server-data.txt','r')
info = dict()
for i in f.read().split(","):
info[i.split(': ')[0]] = i.split(': ')[1]
f.close()
ip = info["ip"]
port = int(info["port"])
server_socket = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
server_socket.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1)
server_socket.bind((ip,port))
server_socket.listen()
sockets_list = [server_socket]
clients = dict()
ban = ["Bruh"]
def receive_message(client_socket):
try:
message_header = client_socket.recv(10)
if not len(message_header):
return False
message_length = int(message_header.decode("utf-8").strip())
return {"header": message_header,"data": client_socket.recv(message_length)}
except:
return False
class Server(QMainWindow):
global server_socket,sockets_list,ban,clients
def __init__(self):
super().__init__()
uic.loadUi('server-ui.ui',self)
# self.sendButton.clicked.connect(self.send)
self.writer("Server started")
# Многопоточность тута
# threader = Thread(target=self.main,name="Main")
# threader.start()
self.th = Thread()
self.th.time_signal.connect(self.update_time)
self.th.rec.connect(self.writer)
self.th.start()
def writer(self,message):
if message:
self.chat.append('икгр')
self.chat.append(message)
def update_time(self,val):
self.datetime.setText(val)
class Thread(QThread):
global server_socket,clients
rec = pyqtSignal(str)
time_signal = pyqtSignal(str)
def __init__(self):
super().__init__()
def run(self):
while 1:
tim = time.localtime()
self.time_signal.emit(f"{tim[2]}.{tim[1]}.{tim[0]} {tim[3]}:{tim[4]}")
time.sleep(0.6)
threader = thr(target=self.send_recv,name="Main")
threader.start()
def send_recv(self):
while 1:
read_sockets,_,exception_sockets = sockets_list,[],sockets_list
for notified_socket in read_sockets:
if notified_socket == server_socket:
client_socket,client_address = server_socket.accept()
user = receive_message(client_socket)
if user is False:
continue
if user['data'].decode('utf-8') not in ban and "_testconn" not in user['data'].decode('utf-8'):
sockets_list.append(client_socket)
clients[client_socket] = user
if "reader" not in user['data'].decode('utf-8'):
self.rec.emit(
f"We have new member ({client_address[0]}: {client_address[1]}) and his name: {user['data'].decode('utf-8')}...")
elif "_testconn" in user['data'].decode('utf-8') and user['data'].decode('utf-8').split('_')[
0] not in ban:
client_socket.send("Server acceped your connection".encode('utf-8'))
else:
self.rec.emit(
f"Server canceled connection for {user['data'].decode('utf-8').split('_')[0]}")
client_socket.send("You are banned".encode('utf-8'))
else:
message = receive_message(notified_socket)
if message is False:
if "reader" not in clients[notified_socket]['data'].decode('utf-8'):
self.rec.emit(
f"{clients[notified_socket]['data'].decode('utf-8')} leave us...")
sockets_list.remove(notified_socket)
del clients[notified_socket]
continue
user = clients[notified_socket]
self.rec.emit(f"{user['data'].decode('utf-8')}: {message['data'].decode('utf-8')}")
for client_socket in clients:
if client_socket != notified_socket:
client_socket.send(user['header'] + user['data'] + message['header'] + message['data'])
for notified_socket in exception_sockets:
sockets_list.remove(notified_socket)
del clients[notified_socket]
app = QApplication(sys.argv)
ex = Server()
ex.show()
sys.exit(app.exec_())