在 python 中配置 websocket 服务器

Configuring a websocket server in python

所以我试图在 python 中配置一个 websocket 服务器,但由于我遇到了一堆相互矛盾的 post(稍后会提供),所以无法完全弄清楚这个问题。 这是服务器的代码:(我将使用 --.---.----.--- 作为 IP)

import asyncio
import websockets

HOST = --.--.---.---

async def echo(websocket, path):
    async for message in websocket:
        print(message)

asyncio.get_event_loop().run_until_complete(
    websockets.serve(echo, host=HOST, port=5500))
asyncio.get_event_loop().run_forever()

此 post 建议的这段代码:https://bytesofgigabytes.com/python/websockets-python/ 说我必须输入我的 IP 地址作为主机。现在我知道这可能是我的调制解调器的 IP 地址,但在这种情况下,我启动了一个 AWS 实例来解决问题。在这种情况下,我收到错误:

OSError: [Errno 10049] error while attempting to bind on address ('--.--.---.---', 5500): the requested address is not valid in its context

我认为是管理员权限,运行 它来自提升的命令提示符,在防火墙中制定了规则但无济于事。

然后我发现 post: 说我不应该输入 IP 地址。所以我没有那样做——这次代码运行了,但我无法通过我在 html/js 上的 websocket 客户端进行连接。它们的代码如下:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <script src="controller.js"></script>
</body>
</html>

const socket = new WebSocket('ws://--.--.---.---:5500/');

socket.addEventListener('open', function (event) {
    console.log("this is running");
    socket.send('Hello Server!');
});

在这种情况下,客户(在 chrome 中)说:

controller.js:1 WebSocket connection to 'ws://--.--.---.---:5500/' failed: 

编辑 1:尝试了这个解决方案,但没有成功 Python, socket.error: [Errno 10049]

编辑 2:确认客户端存在一些问题 - 端口正在侦听 netstat

好的,我明白了。问题不在于代码,至少不完全在于代码。 IP 应该是“0.0.0.0”或“”以便 python 侦听器绑定。更重要的是,在 AWS/Papespace/Linode 中你选择了一个静态 IP。这非常明显,但我错过了它,因为我认为我们默认获得了静态 IP(该死的 linode,这个坏习惯)。此外,根据您的提供商,例如 AWS 需要您在其门户中提供端口。 (附截图)

import asyncio
import websockets

Host = "0.0.0.0"
SocketPort = 5500

async def WebSocketserver(websocket, path):
    Rxdata = await websocket.recv()
    print(f" Received data : {Rxdata}")
    await websocket.send("200")
    

start_server = websockets.serve(WebSocketserver, Host, SocketPort)

asyncio.get_event_loop().run_until_complete(start_server)
asyncio.get_event_loop().run_forever()

除了内部计算机防火墙之外,还需要发生以下AWS防火墙