RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 1573631
Accepted
Alexey
Alexey
Asked:2024-03-28 05:52:15 +0000 UTC2024-03-28 05:52:15 +0000 UTC 2024-03-28 05:52:15 +0000 UTC

设置 WebSocket Secure 时出现问题

  • 772

我正在使用 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'?

javascript
  • 1 1 个回答
  • 164 Views

1 个回答

  • Voted
  1. Best Answer
    Alexey
    2024-03-31T22:29:30Z2024-03-31T22:29:30Z

    它应该被替换async with websockets.server.serve(echo, "мой_хост", 8080, ssl=ssl_context):为async with websockets.serve(echo, "мой_хост", 8080, ssl=ssl_context):. 谢谢大家!

    PS 您也不应该盲目信任 ChatGPT 生成的代码。他很容易犯错误...

    • 1

相关问题

  • 第二个 Instagram 按钮的 CSS 属性

  • 由于模糊,内容不可见

  • 弹出队列。消息显示不正确

  • 是否可以在 for 循环中插入提示?

  • 如何将 JSON 请求中的信息输出到数据表 Vuetify vue.js?

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    我看不懂措辞

    • 1 个回答
  • Marko Smith

    请求的模块“del”不提供名为“default”的导出

    • 3 个回答
  • Marko Smith

    "!+tab" 在 HTML 的 vs 代码中不起作用

    • 5 个回答
  • Marko Smith

    我正在尝试解决“猜词”的问题。Python

    • 2 个回答
  • Marko Smith

    可以使用哪些命令将当前指针移动到指定的提交而不更改工作目录中的文件?

    • 1 个回答
  • Marko Smith

    Python解析野莓

    • 1 个回答
  • Marko Smith

    问题:“警告:检查最新版本的 pip 时出错。”

    • 2 个回答
  • Marko Smith

    帮助编写一个用值填充变量的循环。解决这个问题

    • 2 个回答
  • Marko Smith

    尽管依赖数组为空,但在渲染上调用了 2 次 useEffect

    • 2 个回答
  • Marko Smith

    数据不通过 Telegram.WebApp.sendData 发送

    • 1 个回答
  • Martin Hope
    Alexandr_TT 2020年新年大赛! 2020-12-20 18:20:21 +0000 UTC
  • Martin Hope
    Alexandr_TT 圣诞树动画 2020-12-23 00:38:08 +0000 UTC
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5