Я не знаком с asyncio, поэтому я попытаюсь добраться до точки с функциями / потоками;
Обычно, моя серверная сторона слушает одно соединение, и как только оно его принимает, у меня есть функция 'обработчик', который связан с каждым принимаемым соединением.
часть моего сервера и обработчик:
def handler(conn, addr):
global data1
while True:
data = conn.recv(2048)
data1 = json.loads(data.decode())
# treat it as you need
while True:
s.listen(1)
conn, addr = s.accept()
print('Conectado com', addr[0],':', str(addr[1]))
thr = threading.Thread(target = handler, args = (conn, addr)).start()
Теперь, для контроля клиентов и тому подобного, я всегда использую толковый словарь. Ключ должен быть именем пользователя или любой другой конкретной информацией. Значение ключа - это «соединение» от этого пользователя. Таким образом, вы можете получить соединение пользователя 'x' по его ключу c.
Что-то вроде:
import socket
import time
import datetime as dt
import base64
import os
import json
import threading
HOST = ''
PORT = 12999
global s
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
s.bind((HOST,PORT))
whoto = {}
def autenticacao():
global data1
global conn
global nomeuser
user1 = data1[1]
passwd = data1[2]
auth = c.execute('SELECT usuario FROM fullinfo WHERE usuario= ? AND password = ?', (user1,passwd)).fetchone()
if auth is not None:
word = 'autenticado'
conn.sendall(word.encode())
nomeuser = auth[0]
whoto[nomeuser] = conn
Извините, я оставляю это невоспроизводимым, но моя цель - показать «алгоритм». Этот словарь - то, что я использую, чтобы вести учет того, кто находится в сети, адрес (conn) каждого клиента для отправки сообщений отдельным клиентам и тому подобное. В приведенном выше примере я добавляю пользователя (ключ) и conn (значение), как только он аутентифицирован на моем сервере.
Надеюсь, это поможет. Удачи!