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

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) - як його можна  ідентифікувати, скажімо, якщо він зайде вже з іншого компа?

А що повинно цю програму зациклити, щоб вона не відпрацьовувала 1 раз?
Я бачу там 2 функції, одна викликає іншу, відпрацьовує раз і ад'йо. Так і повинно працювати у даному випадку.

Igor2009 написав:

Цікавить напрямок створювання інтелекту для роботів. Чи правильно я зробив, що обрав Python?

Це дивлячись на те, якого плану роботи.
І якого плану АІ.
Якщо роботи малогабаритні - пайтон може виявитись не найкращим варіком через брак швидкості вбудованих систем.
Якщо промислові, і питання про "напхать жирноти" не стоїть - можна і на пайтоні.

Корочє, доведеться самому відповісти собі :)
Треба явний run
тобто, требя через явний main. І await продовбано, звісно

Переписати так:

...
serverr = Serverws()


async def main():
    start_server = await websockets.serve(serverr.ws_handler,cip,hostport)
    await start_server.wait_closed()
    
asyncio.run(main())

Ще спостерігається дісконнект при відправці повідомлення

AppData\Roaming\Python\Python311\site-packages\websockets\legacy\server.py:-1: RuntimeWarning: coroutine 'WebSocketCommonProtocol.send' was never awaited
RuntimeWarning: Enable tracemalloc to get the object allocation traceback
INFO:websockets.server:connection closed

P.S. в коді, що я навів - нема логів, реально вони там є (якщо хтось запитає хто пише "INFO:websockets.server:connection closed")

З версії 3.10 по викидали депрікейти, які давно хотіли.
run_until_complete, на приклад - вже нормально не працює... Старі приклади, що є у цих наших інтернетах - більшою частиною вже не актуальні.

Є бажання для тестів створити вебсокетний сервер. Намагаюсь щось зробити по прикладах - валиться куча помилок. Гуглю - це через перехід на 3.10

Відкатити назад - не хочу.
тому питання:
Э старий приклад




import asyncio
import websockets
import logging, sys #... і ще там що треба
hostport = "12345"
cip=""#потім з'ясовується реальний IP, який підставляється актуальний. Десь там, воно працює.

class Serverws:
    clients=set()

    async def register(self, ws :WebSocketServerProtocol) -> None:
        self.clients.add(ws)

    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()
start_server = websockets.serve(serverr.ws_handler,cip,hostport)
asyncio.get_event_loop().run_until_complete(start_server)
asyncio.get_event_loop().run_forever()

По перше, run_until_complete - зараз робити нетреба, а треба робити .run

Так от, в такому вигляді - воно як було - вже нормально не працює:

webs_srv.py:88: DeprecationWarning: There is no current event loop
  asyncio.get_event_loop().run_forever()

і потім при спробі конекту - конектить клієнта. але якщо клієнт відішле повідомлення - ніфіга не трапляється взагалі. а повинно роздати месседж усім клієнтам, що наявні.

Як зараз коректно запускати асинхронно отаке на базі класу?
На скільки я розумію - якщо я розвалю це на окремі функції - проблем буде менше. Але, не хотілося б.

P.S. чи, може, там в коді помилка? бо приклад не мій, я на його базі намагаюсь зрозуміти як це робити.