我只是想建立一个基本的互联网websocket连接。代码似乎没问题——因为当连接到本地主机时它能够工作,但是当我尝试在互联网上使用它时却失败了。我正在使用websockets库,我的服务器看起来像这样:
#!/usr/bin/env python3
import asyncio
import websockets
from logging import getLogger, INFO, StreamHandler
logger = getLogger('websockets')
logger.setLevel(INFO)
logger.addHandler(StreamHandler())
clients = set()
async def handler(websocket, path):
global clients
clients.add(websocket)
try:
await asyncio.wait([ws.send("Hello!") for ws in clients])
await asyncio.sleep(10)
finally:
clients.remove(websocket)
start_server = websockets.serve(handler, host='127.0.0.1', port=6969)
asyncio.get_event_loop().run_until_complete(start_server)
asyncio.get_event_loop().run_forever()
客户端的外观如下:
<!DOCTYPE html>
<html lang="en"><head>
<meta charset="UTF-8">
<title>Chat</title>
</head>
<body style="margin:0">
<script type="text/javascript">
var ws = new WebSocket("ws://127.0.0.1:6969/");
var messages = document.getElementById('messages');
ws.onmessage = function (event) {
var messages = document.getElementById('messages');
var message = document.createElement('li');
var content = document.createTextNode(event.data);
message.appendChild(content);
messages.appendChild(message);
};
</script>
Messages:
<ul id="messages"><li>Hello!</li></ul>
</body></html>
所遇问题为,客户端表现正常,但在我在Ubuntu服务器上运行该服务(并确保将端口6969转发到该机器),并尝试通过互联网连接时出现问题。主机名解析正常,因为我可以使用
ssh
连接来启动服务器,但是尝试连接WebSocket始终显示以下错误消息:
Firefox 无法建立与 ws://<远程服务器URL>:6969/ 的连接。
其他浏览器类似。此外,如果有人想知道,记录器没有输出任何有用的信息(由于连接失败,因此服务器没有执行任何操作)。
var ws = new Websocket("ws://127.0.0.1:6969/");
更改为var ws = new Websocket("ws://<远程服务器URL>:6969/");
。 - ocket8888websockets.serve()
代码行更改为:websockets.serve(handler, port=6969)
。这样在任何环境下都应该能够正常工作。 - Robᵩwebsockets.serve(handler, host="", port=6969)
,现在我可以连接了。如果您想写一个答案,我很乐意接受,并且我也会感激一下为什么我所做的不起作用的解释。 - ocket8888