Answer the question
In order to leave comments, you need to log in
How to distribute data stream through Sockets in Python?
My goal is to create a chat with authorization using PyQt5, the problem is that I need to simultaneously process the client throwing authorization, if successful, add it to the chat and a message from another client addressed to the chat.
There is also a list of online clients. I commented on all the lines as a train of thought. Tell me how to make a simultaneous connection to the chat and mailing messages. Refactoring is welcome. As well as links to all possible sources of solving the problem :) THANKS in advance
# 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
Answer the question
In order to leave comments, you need to log in
Didn't find what you were looking for?
Ask your questionAsk a Question
731 491 924 answers to any question