A
A
Amir Shabanov2016-05-12 22:46:47
Python
Amir Shabanov, 2016-05-12 22:46:47

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 question

Ask a Question

731 491 924 answers to any question