Go语言 Javascript websockets打开后立即关闭

lc8prwob  于 2022-12-25  发布在  Go
关注(0)|答案(6)|浏览(263)
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中都有发生。
我在网上看了一堆不同的类似例子,但无济于事。

5t7ly7z5

5t7ly7z51#

要保持WebSocket打开,请防止处理程序在connection.onmessage中按return false;返回,如下所示:

connection.onmessage = function(e){
   var server_message = e.data;
   alert(server_message);
   return false;
}
ccgok5k5

ccgok5k52#

我相信我偶然发现了OP找到的解决方案,但不幸地未能解释。我没有足够的声誉发表评论,否则我会回应所有的困惑评论,乞求OP的回应澄清。
简单地说,我认为OP指的是他的 * 服务器端连接处理程序 *,当他说“我所要做的就是在WebSocket连接关闭之前阻止处理程序返回”时。
我的服务器自动关闭WebSocket是因为我不明白某个webSocket函数是如何工作的,具体来说,我使用了一个Python服务器脚本,其中包含asyncio/websockets和以下代码:

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中最初包含的循环来修复这个问题。希望这对那里的人有帮助。

h43kikqp

h43kikqp3#

当你试图通过一个WebSocket连接发送二进制数据时,也可能会出现这种情况,但是某一方(客户端或服务器)试图将其解释为文本--许多库和框架都会这样做,除非你明确指定你确实想要二进制数据。

w51jfk4q

w51jfk4q4#

也可能是登录问题。WebSocket将自动关闭需要验证的网站,但没有提供验证信息。

irtuqstp

irtuqstp5#

把这篇文章和其他文章中的提示拼凑在一起,我发现了一个在使用python WebSocket服务器示例时有效的解决方案,该示例随处可见,包括如下内容:

async def handler(websocket, path):
    data = await websocket.recv()
    reply = f"Data recieved as: {data}!"
    await websocket.send(reply)

对于我们这些刚接触WebSocket的人来说,我认为假设是每次客户端发送消息时都会调用handler函数,事实证明并非如此,正如其他人提到的,只要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控制台都得到了所有预期的日志消息。
如果任何对这个主题更了解的人可以评论一下这是否是一个适合通用的解决方案,或者这里是否有需要注意的地方,我们将不胜感激。

hkmswyz6

hkmswyz66#

修好了!
我所要做的就是在WebSocket连接关闭之前阻止处理程序返回

相关问题