amirkaaa
@amirkaaa
Student from Kazakhstan

Как распределить поток данных через Сокеты в Python?

Моей целью является создание чата с авторизацией используя PyQt5 проблема в том что нужно одновременно обработать клиента кидающий авторизацию в случае успеха добавить его в чат и сообщение от другого клиента адрессованое в чат.
Так же есть список онлайн клиентов. Прокомментировал все строки как ход мыслей. Скажите как сделать одновременное подключение в чат и рассылку сообщений. Рефакторинг приветствуется. А так же ссылки на все возможные источники решения проблемы :) Заранее СПАСИБО

# RUN USING -U -> $ python -u server.py
import socket
import time
import threading
from databasetools import *
clientslist = []
sock = socket.socket()
sock.bind(("localhost", 9094))
sock.listen(5)
usernamedict = {}

while(True):
    try:
        socketchannel, socketip = sock.accept()
        username = socketchannel.recv(1024).decode(encoding = 'UTF-8') #принимает логин от клиента 
        password = socketchannel.recv(1024).decode(encoding = 'UTF-8') #принимает пароль от клиента

        if databasetools.chatuserselect(username, password):  #проверяет наличие пользователя в БД, отправляет True
            usernamedict[socketchannel] = username # добавляем имя юзера в список онлайн 
            clientslist.append(socketchannel) # добавляем канал для раздачи сообщение остальным пользователям
            socketchannel.send("appended".encode(encoding = 'UTF-8')) #отправляем ответ для перересовки чат интерфейса 
            t = threading.Thread(target=messagedelivery, args=(socketchannel))  #сама функция рассылки сообщений 
            t.start()
        else:
            socketchannel.send("notappended".encode(encoding = 'UTF-8')) # ответ клиенту об ошибке
            socketchannel.close()  # закрываем этот канал
    except:
        pass

def messagedelivery(socketchannel):
    while (True):
        message = sock.recv(1024).decode(encoding = 'UTF-8') #сообщение от клиента в чат 
        if "/pleasedropme" in message:  # выход из чата по сообщению 
            socketchannel.close()  # закрываем канал от отправившего клиента 
            clientslist.remove(socketchannel) # удаляем из списка рассыки сообщения 
            usernamedict.pop(socketchannel) # удаляем пользователя из списка онлайн
            for client in clientslist:
                client.send(usernamedict[socketip] + ":" + "Logged".encode(encoding = "UTF-8")) #сообщения пользователям о выходе 
        else:    
            for client in clientslist:
                client.send(usernamedict[socketip] + ":" + message + "(" + str(time.ctime(time.time())) + ")" + "/n".encode(encoding='UTF-8')) #рассылка сообщения username + message + time
  • Вопрос задан
  • 712 просмотров
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы