connection = new WebSocket("ws://localhost:1050/join?username=test")
connection.onopen = function(){
alert('Connection open!');
}
connection.onmessage = function(e){
var server_message = e.data;
alert(server_message);
}
connection.onclose = function() {
alert("websocket closing")
}
与服务器的连接已建立,并显示连接打开的警报!但此后连接立即关闭。服务器没有调用 close 并且控制台中似乎没有其他错误。 Chrome 和 Firefox 中都会发生这种情况。
我在网上查看了一堆不同的类似示例,但无济于事。
保持 Websocket 打开,防止处理程序通过
return false;
中的 connection.onmessage
返回
像这样:
connection.onmessage = function(e){
var server_message = e.data;
alert(server_message);
return false;
}
我相信我偶然发现了OP找到的解决方案,但未能解释清楚。我没有足够的声誉来发表评论,否则我会回应所有请求澄清 OP 回应的混乱评论。
简短的版本是,我认为 OP 指的是他的服务器端连接处理程序,当他说“我所要做的就是在 websocket 连接关闭之前阻止处理程序返回”。
原来我的服务器自动关闭了 webSocket,因为我不明白某个 webSocket 功能是如何工作的。具体来说,我使用带有 asyncio/websockets 的 Python 服务器脚本和以下代码:
async def receiveCommandsLoop(player):
while True:
msg = await player.websocket.recv()
print(command)
async def handleClient(websocket, path):
username = await websocket.recv()
player = players[username]
...
#Start task to listen for commands from player
asyncio.get_event_loop().create_task(receiveCommandsLoop(player))
start_server = websockets.serve(handleClient, '', 8765)
我们的想法是,websockets.serve 将使用 handleClient 开始连接并进行一些设置,然后使用 receiveCommandsLoop 创建一个新任务来接管通信工作。
但事实证明:当您调用 websockets.serve 时,Python 期望当您的处理程序(在本例中为 handleClient)返回时,您必须完成套接字的处理,并且它会自动关闭它。
因此,当 receiveCommandsLoop 运行时,handleClient 已返回,并且 webSocket 已自动关闭。
我可以通过简单地修改我的handleClient函数来直接运行最初包含在receiveCommandsLoop中的循环来解决这个问题。希望这对那里的人有帮助。
将这篇文章和其他文章中的提示拼凑在一起,我找到了一个在使用随处可见的 python websocket 服务器示例时有效的解决方案,其中包括类似的内容:
async def handler(websocket, path):
data = await websocket.recv()
reply = f"Data recieved as: {data}!"
await websocket.send(reply)
对于我们这些刚接触 websocket 的人来说,我认为假设是每次客户端发送消息时都会调用
handler
函数,但事实证明并非如此。正如其他人提到的,一旦处理函数返回一次,连接就会关闭。我找到的解决方案是将其更改为:
async def handler(websocket, path):
async for data in websocket:
reply = f"Data recieved as: {data}!"
print(data)
await websocket.send(reply)
我的客户端 JavaScript 代码与 OP 相同,我无需更改任何内容即可正常工作。
不幸的是,我无法解释为什么
async for data in websocket:
让它实际上永远等待并在每次收到消息时自发地运行内部代码块,但它对我来说确实如此,我在 python 服务器端和客户端 JavaScript 控制台。
如果对这个主题更了解的人可以评论这是否是一个通用的解决方案,或者是否有一个需要注意的问题,我们将不胜感激。
当您尝试通过 websocket 连接发送二进制数据,但某些方面(客户端或服务器)试图将其解释为文本时,也可能出现这种情况 - 许多库和框架都会这样做,除非您明确指定您这样做想要二进制数据。
也可能是登录问题。 websocket会自动关闭需要认证但没有提供认证信息的网站。
websockets 版本 14.0 在处理连接方面存在一些问题。降级到某个版本,例如- 12.0 解决了这个问题。
修好了!
我所要做的就是在 websocket 连接关闭之前阻止处理程序返回