1

Тема: Як ідентифікувати клієнтів у вигляді WebSocketServerProtocol?

Є такий достатньо відомий код

import asyncio
import websockets
from websockets import WebSocketServerProtocol
import logging, sys #... і ще там що треба




class Serverws:
    clients=set()
    hostip = None
    hostport = None
    def __init__(self, hostip, hostport):  
        self.hostip = hostip  
        self.hostport = hostport  


    async def register(self, ws :WebSocketServerProtocol) -> None:
        self.clients.add(ws)
        for client in self.clients:
            print(ws.remote_address)

    async def unregister(self, ws: WebSocketServerProtocol) -> None:
        self.clients.remove(ws)

    async def send_to_clients(self, message: str) -> None:
        if self.clients:
            await asyncio.wait([client.send(message) for client in self.clients])

    async def ws_handler(self, ws: WebSocketServerProtocol, uri: str) -> None:
        await self.register(ws)
        try:
            await self.distribute(ws)
        finally:
            await self.unregister(ws)

    async def distribute(self, ws: WebSocketServerProtocol) -> None:
        async for message in ws:
            await self.send_to_clients(message)

# і от раніше там було таке:
serverr = Serverws('localhost',8765)
start_server = websockets.serve(serverr.ws_handler, serverr.hostip, serverr.hostport)
asyncio.get_event_loop().run_until_complete(start_server)
asyncio.get_event_loop().run_forever()

Він вміє ехо. Тобто, він вміє приймати конект (при цьому друкувати ('::1', 51682, 0, 0)) і робити ехо.

Як його розширити щоб, наприклад, не усим слати меседж (зараз він шле ехо всим, включно з автором месаги), а усим ОКРІМ автора. А далі - усим, хто є в фільтрі (скажімо, в вручну створеному, чи з файла).

Клієнти зберігаються в множині clients=set(), але то ті, що зайшли і відомі... як зберігти якогось, хто, наприклад, пройшов авторизацію?
Оцей, в якого ремоут адрес ('::1', 51682, 0, 0) - як його можна  ідентифікувати, скажімо, якщо він зайде вже з іншого компа?

2

Re: Як ідентифікувати клієнтів у вигляді WebSocketServerProtocol?

Vaclav написав:

Є такий достатньо відомий код

уперше бачу

Vaclav написав:

Як його розширити щоб, наприклад, не усим слати меседж

await asyncio.wait([client.send(message) for client in self.clients if умова_для(client)])

умову пишіть самі, залежно від потреб
Можете додати окремий масив self.clients_to_send чи якось так і заносити туди лише тих, кому треба слати повідомлення. Тоді, відповідно, і цикл буде лише по них.

як зберігти якогось, хто, наприклад, пройшов авторизацію?

Тримати десь (зазвичай для цього БД використовують) список юзерів і додати протокол авторизації, а тих, хто пройшов, додавати в окремий список/множину. Тільки врахуйте, що клієнт, який ще не авторизувався - це вже клієнт, тільки ще не авторизований.