Моей целью является создание чата с авторизацией используя 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