#python #websocket #path #endpoint #serve
Вопрос:
Я хочу добавить путь к концу URL-адреса сервера websocket, но это не работает. Например ws://111.111.11.111:8080/websocket
. Я хочу добавить URL-адрес /websocket
после номера порта, как это. Как мне это сделать?
- Сначала я протестировал, на стороне клиента,
ws://111.111.11.111:8080/websocket
. - А во-вторых, изменил 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»: перед отправкой данных.