Проблема с указанием пути в URL-адресе сервера websocket

#python #websocket #path #endpoint #serve

Вопрос:

Я хочу добавить путь к концу URL-адреса сервера websocket, но это не работает. Например ws://111.111.11.111:8080/websocket . Я хочу добавить URL-адрес /websocket после номера порта, как это. Как мне это сделать?

  1. Сначала я протестировал, на стороне клиента, ws://111.111.11.111:8080/websocket .
  2. А во-вторых, изменил URL на ws://111.111.11.111:8080 .

В результате оба были подключены к серверу. И показать тот же результат. Почему? Разве он не может быть подключен только тогда, когда указан /websocket путь? Что мне делать?

Код на стороне сервера
 import websockets

async def web_server(websocket, path):
    while True:
        publish_to_client = json.dumps(sub.status)
        await websocket.send(publish_to_client)
        await asyncio.sleep(0.1)

if __name__ == "__main__":
    start_server = websockets.serve(web_server, "111.111.11.111", 8080)
    asyncio.get_event_loop().run_until_complete(start_server)
    asyncio.get_event_loop().run_forever()
 
Код на стороне клиента -> отображение веб —
 <!DOCTYPE html>
<html>
    <head>
        <title>WebSocket demo</title>
    </head>
    <body>
        <script>
            var ws = new WebSocket("ws://111.111.11.111:8080/websocket"),
                messages = document.createElement('ul');
            ws.onmessage = function (event) {
                var messages = document.getElementsByTagName('ul')[0],
                    message = document.createElement('li'),
                    content = document.createTextNode(event.data);
                message.appendChild(content);
                messages.appendChild(message);
            };
            document.body.appendChild(messages);
        </script>
    </body>
</html>
 

Ответ №1:

В коде Python нигде не упоминается путь "/websocket" , поэтому я бы не ожидал, что он будет выполнять фильтрацию, которую вы желаете.

 start_server = websockets.serve(web_server, "111.111.11.111", 8080)
 

Сервер привязан к IP-адресу и порту. Любое входящее соединение websocket будет отправлено web_server() , независимо от пути.

 async def web_server(websocket, path):
    ...
 

Этот метод обрабатывает все веб-сайты. Он прошел path проверку и может использовать эту информацию так, как пожелает. Метод, который вы написали, не проверяет path переменную, поэтому он будет обрабатывать запросы по любому пути, если IP-адрес и порт указаны правильно.

Если вы хотите, чтобы принимались только определенные пути, вам нужно будет реализовать эту логику самостоятельно. Проверьте path и примите или отвергните их с любой логикой, которую вы пожелаете.

Комментарии:

1. Спасибо! Я работаю! Я добавил —> если путь == «/ws»: перед отправкой данных.