2014-04-29 73 views
4
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") 
} 

与服务器的连接已建立,并且会显示连接打开警报!然而,紧接着关闭连接。服务器不会关闭,控制台中似乎没有其他错误。这在Chrome和Firefox中都有发生。打开后立即关闭Javascript网络套件

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

+1

这个问题可能在你的服务器代码中,你可以发布它吗? –

+1

如果您使用'code.google.com/p/go.net/websocket',一旦处理函数退出,连接就会关闭。这是设计,不会给出任何错误。也许这可能是问题? – ANisus

+0

我正在使用它。 有什么办法可以避免这种情况发生,或者它本身就是我们无法解决的图书馆设计的一部分? –

回答

0

修正了它!

我所要做的就是从块返回处理程序的WebSocket连接关闭之前

+1

将您的答案标记为已接受。这非常好。 – kostix

+12

请您详细说明一下吗?我现在有同样的问题。处理程序返回是什么意思? – lakesare

+2

请详细说明!!!有同样的问题。 – dimitris93

0

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

2

保持的WebSocket运行结束防止处理器在connection.onmessage 这样的return false;返回:

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

它也可能是一个登录的问题。 websocket将自动关闭网站所需的认证,但没有提供认证信息。

1

我相信我偶然发现了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中的循环来解决这个问题。希望这可以帮助那里的人。