Асинхронный чат на python multiprocessing

Всем привет. Пытаюсь разобраться с многопоточностью в python. Пишу простой чат с возможностью установки ника .

Сервер:

import multiprocessing as mp
import signal
import socket
from time import sleep
from loguru import logger


class Server:
    def __init__(self) -> None:
        self.host = "127.0.0.1"
        self.port = 5555
        self.server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        self.server.bind((self.host, self.port))
        self.server.listen()
        self.clients = []
        self.nicknames = []
        logger.info("server is started")
        self.queue = mp.Queue()

    def broadcast(self, message):
        for client in self.clients:
            logger.debug(message)
            client.send(message)
            sleep(2)

    def handle(self, client):
        while True:
            try:
                message = client.recv(1024)
                self.broadcast(message)
            except Exception as er:
                if client in self.clients:
                    index = self.clients.index(client)
                    self.clients.remove(client)
                    client.close()
                    nickname = self.nicknames[index]
                    self.broadcast(f'{nickname} left the Chat!'.encode('ascii'))
                    self.nicknames.remove(nickname)
                    break
                else:
                    logger.exception(er)
                    self.server.close()

    def recieve(self):
        while True:
            client, address = self.server.accept()
            print(f"Connected with {str(address)}")
            client.send('NICK'.encode('ascii'))
            nickname = client.recv(1024).decode('ascii')
            sleep(2)
            self.nicknames.append(nickname)
            self.clients.append(client)
            print(f'Nickname of the client is {nickname}')
            self.broadcast(f'{nickname} joined the Chat'.encode('ascii'))
            client.send('Connected to the Server!'.encode('ascii'))
            thread = mp.Process(target=self.handle, args=(client,))
            thread.start()

if __name__ == '__main__':
    s = Server()
    s.recieve()
        

Клиент:

import socket
import multiprocessing as mp
import threading
from time import sleep
import asyncio as asyn
from loguru import logger


class Client():

    def __init__(self, nickname) -> None:
        self.nickname = nickname

        self.client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        self.client.connect(('127.0.0.1', 5555))
        self.stop_thread = False

    def recieve(self):
        while True:
            if self.stop_thread:
                break    
            try:
                message = self.client.recv(1024).decode('ascii')
                if message == 'NICK':
                    self.client.send(self.nickname.encode('ascii'))
                    sleep(1)
                else:
                    sleep(1)
                    logger.info(message)
            except Exception as er:
                self.client.close()
                self.stop_thread = True
                logger.exception(er)
                break
            
    def write(self, text):
        message = f'{self.nickname}: {text}'
        
        self.client.send(message.encode('ascii'))

if __name__ == '__main__':
    c = Client("test3")
    with mp.Pool(4) as pool:
        message_resoult = pool.apply(c.recieve)
        write_resoult = pool.apply(c.write, ["assaaasd"])

Проблема в том, что при вызове message_resoult = pool.apply(c.recieve) На клиенте процесс повисает и код не выполняется дальше. Как я понимаю это происходит из-за while True в функции чтения ответа от сервера. Вопрос: Как мне постоянно принимать ответы от сервера и сохранять их в переменную для передачи ее на qt интерфейс. А также отправлять сообщения от клиента.


Ответы (0 шт):