打开后立即关闭Javascript websockets

Ani*_*edi 6 javascript go websocket

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")
}
Run Code Online (Sandbox Code Playgroud)

建立与服务器的连接,并显示连接打开的警报!然而,紧接着连接关闭.服务器不会调用close,控制台中似乎没有其他错误.这在chrome和firefox中都有发生.

我在网上看了一堆不同的类似例子,但无济于事.

His*_*ram 6

保持Websocket return false;处于打开状态,以防止处理程序connection.onmessage 像这样返回:

connection.onmessage = function(e){
   var server_message = e.data;
   alert(server_message);
   return false;
}
Run Code Online (Sandbox Code Playgroud)

  • 看来你救了我的命 (2认同)

小智 6

我相信我偶然发现了OP所找到的解决方案,但不幸地无法解释。我没有足够的声誉来发表评论,否则我将回应所有困惑的评论,要求澄清OP的响应。

简短的版本是,当他说“我要做的就是在websocket连接关闭之前阻止该处理程序返回”时,我认为OP就是指他的服务器端连接处理程序

事实证明,我的服务器正在自动关闭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)
Run Code Online (Sandbox Code Playgroud)

这个想法是websockets.serve将使用handleClient开始连接并进行一些设置,然后使用receiveCommandsLoop创建一个新任务来接管通信工作。

事实证明:当您调用websockets.serve时,Python希望当处理程序(在本例中为handleClient)返回时,必须完成套接字,并自动关闭它。

因此,在运行receiveCommandsLoop时,handleClient已返回,并且webSocket已自动关闭。

我可以通过简单地修改handleClient函数来直接运行receiveCommandsLoop中最初包含的循环来解决此问题。希望这可以帮助某人。


Ani*_*edi -8

修复!

我所要做的就是在 websocket 连接关闭之前阻止处理程序返回

  • 您能详细说明一下吗?我现在也有同样的问题。处理程序返回是什么意思? (15认同)
  • 将您的答案标记为已接受。这完全没问题。 (3认同)