我正在使用 WebSocket 制作类似聊天机器人的东西。客户端使用原生 JavaScript,服务器使用 Python。以下是最低限度可重复的示例:
服务器.py
import asyncio
import websockets
async def echo(websocket, path):
async for message in websocket:
await websocket.send("Сообщение получено: " + message)
await websocket.send("Здесь должен быть ответ на сообщение...")
async def main():
async with websockets.serve(echo, "мой_хост", 1234):
await asyncio.Future()
asyncio.run(main())
客户端.js
<script>
const socket = new WebSocket('ws://мой_хост:1234');
</script>
所以一切都很好。下一步是使用 WSS 而不仅仅是 WS 来完成所有操作。相应地对代码进行了以下更改:
服务器.py
import asyncio
import websockets
import ssl
async def echo(websocket, path):
async for message in websocket:
await websocket.send("Сообщение получено: " + message)
await websocket.send("Здесь должен быть ответ на сообщение...")
async def main():
ssl_context = ssl.create_default_context(ssl.Purpose.CLIENT_AUTH)
ssl_context.load_cert_chain(certfile="прописал_путь_к,сертификату", keyfile="прописал_путь_к_ключу")
async with websockets.server.serve(echo, "мой_хост", 443, ssl=ssl_context):
await asyncio.Future()
asyncio.run(main())
客户端.js
<script>
const socket = new WebSocket('wss://мой_хост:443');
</script>
我正在启动服务器nohup python3 -m server.py &。
问题是客户端在浏览器控制台中显示以下错误:
与“wss://my_host/”的 WebSocket 连接失败:
我究竟做错了什么?
我使用 Plesk 网络托管平台。Apache 版本 2.4.52,nginx 版本 1.24.0。我认为 Apache 是主要的。操作系统 Ubuntu 22.04.4 LTS。
UPD
我尝试将其添加到/var/www/vhosts/system/мой_хост/conf/httpd.conf行中......
ProxyPass /wss/ wss://мой_хост:443/
ProxyPassReverse /wss/ wss://мой_хост:443/
...用于代理并重新启动服务器。没有帮助...
UPD 添加了额外的 nginx 指令:
location /wss/ {
proxy_pass https://мой_хост:443;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host $host;
}
...也没有任何作用。
UPD 让我提出一个问题:如何为 Ubuntu 配置 WSS?
UPD 当然,您可以在没有代理的情况下执行所有操作,以便客户端和服务器直接交互。但即使这样也不起作用...我在客户端和服务器中将端口从 443 更改为 8080...它仍然写相同的“连接到 'wss://my_host/' 失败”
UPD
我像这样启动服务器python3 -m server.py并收到以下错误:
File "/usr/lib/python3.10/runpy.py", line 187, in _run_module_as_main
mod_name, mod_spec, code = _get_module_details(mod_name, _Error)
File "/usr/lib/python3.10/runpy.py", line 110, in _get_module_details
__import__(pkg_name)
File "/var/www/vhosts/мой_хост/httpdocs/chatbot/server.py", line 21, in <module>
asyncio.run(main())
File "/usr/lib/python3.10/asyncio/runners.py", line 44, in run
return loop.run_until_complete(main)
File "/usr/lib/python3.10/asyncio/base_events.py", line 649, in run_until_complete
return future.result()
File "/var/www/vhosts/мой_хост/httpdocs/chatbot/server.py", line 18, in main
async with websockets.server.server(echo, "мой_хост", 8080, ssl=ssl_context):
File "/usr/local/lib/python3.10/dist-packages/websockets/imports.py", line 92, in __getattr__
raise AttributeError(f"module {package!r} has no attribute {name!r}")
AttributeError: module 'websockets' has no attribute 'server'. Did you mean: 'serve'?
它应该被替换
async with websockets.server.serve(echo, "мой_хост", 8080, ssl=ssl_context):为async with websockets.serve(echo, "мой_хост", 8080, ssl=ssl_context):. 谢谢大家!PS 您也不应该盲目信任 ChatGPT 生成的代码。他很容易犯错误...