打开后立即关闭Javascript websockets

时间:2014-04-29 06:20:33

标签: javascript websocket go

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中都有发生。

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

5 个答案:

答案 0 :(得分:5)

保持Websocket打开阻止处理程序在return false;connection.onmessage返回 像这样:

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

答案 1 :(得分:2)

我相信我偶然发现了OP找到的解决方案,但却难以解释。我没有足够的声誉来评论,否则我会回应所有混淆的评论,要求澄清OP的回应。

简短的版本是我认为OP指的是他的服务器端连接处理程序,当他说“我必须做的就是阻止处理程序在websocket连接关闭之前返回”。< / p>

事实证明我的服务器正在自动关闭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中的循环来解决这个问题。希望这可以帮助那些人。

答案 2 :(得分:0)

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

答案 3 :(得分:0)

这也可能是登录问题。 websocket将自动关闭网站所需的身份验证,但未提供身份验证信息。

答案 4 :(得分:-4)

修正了它!

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