为什么方法print()在带有套接字的Python中不起作用?

我正在尝试在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_())
inuyasha7 回答:为什么方法print()在带有套接字的Python中不起作用?

暂时没有好的解决方案,如果你有好的解决方案,请发邮件至:iooj@foxmail.com
本文链接:https://www.f2er.com/3115499.html

大家都在问