Javascript WebSocket在打开后立即关闭
已建立与服务器的连接,并显示连接打开警报!然而,随后连接立即关闭。服务器不调用close,控制台中似乎没有其他错误。这在chrome和firefox中都有发生 我在网上看了很多不同的类似例子,但都没有用 修好了Javascript WebSocket在打开后立即关闭,javascript,websocket,go,Javascript,Websocket,Go,已建立与服务器的连接,并显示连接打开警报!然而,随后连接立即关闭。服务器不调用close,控制台中似乎没有其他错误。这在chrome和firefox中都有发生 我在网上看了很多不同的类似例子,但都没有用 修好了 我所要做的就是在websocket连接关闭之前阻止处理程序返回当您试图通过websocket连接发送二进制数据时,也可能会出现这种情况,但在某些方面(客户端或服务器)试图将其解释为文本-许多库和框架都会这样做,除非您明确指定您确实需要二进制数据。要保持Websocket打开,请通过ret
我所要做的就是在websocket连接关闭之前阻止处理程序返回当您试图通过websocket连接发送二进制数据时,也可能会出现这种情况,但在某些方面(客户端或服务器)试图将其解释为文本-许多库和框架都会这样做,除非您明确指定您确实需要二进制数据。要保持Websocket打开,请通过
return false防止处理程序返回代码>在connection.onmessage中
像这样:
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")
}
这也可能是一个登录问题。websocket将自动关闭网站所需的身份验证,但未提供任何身份验证信息。我相信我偶然发现了OP找到的解决方案,但不幸未能解释。我没有足够的声誉来评论,否则我会回应所有困惑的评论,要求对OP的回应做出澄清
简短的版本是,我认为OP指的是他的服务器端连接处理程序,他说“我所要做的就是在websocket连接关闭之前阻止处理程序返回”
原来我的服务器是自动关闭webSocket的,因为我不明白某个webSocket函数是如何工作的。具体来说,我使用了一个带有asyncio/WebSocket的Python服务器脚本和以下代码:
connection.onmessage = function(e){
var server_message = e.data;
alert(server_message);
return false;
}
当时的想法是websockets.serve将使用handleClient开始连接并进行一些设置,然后使用ReceiveCommandsLop创建一个新任务,该任务将接管通信工作
但事实证明:当您调用websockets.service时,Python希望当您的处理程序(在本例中为handleClient)返回时,您必须处理好套接字,并且它会自动关闭它
因此,在运行receiveCommandsLoop时,handleClient已返回,webSocket已自动关闭
我可以通过修改handleClient函数直接运行最初包含在receiveCommandsLoop中的循环来解决这个问题。希望这对其他人有所帮助。问题可能出在您的服务器代码中,您可以发布它吗?如果您使用code.google.com/p/go.net/websocket
,处理程序函数退出后,连接将立即关闭。这是故意的,不会有任何错误。也许这就是问题所在?我正在用它。有没有办法避免这种情况的发生,或者这是我们无法解决的库设计的固有部分?我正在使用express ws,用于express应用程序的WebSocket端点。我在试图绕过应用程序路由并简单地使用wss.on('connection')时遇到了相同的问题服务器端。一旦我用app.ws('/ws')打开了一个应用程序路由,那么websocket连接将保持不变。请将您的答案标记为已接受。这很好,你能详细说明一下吗?我现在也有同样的问题。你说的处理者返回是什么意思?我不明白你的意思…你能提供一些关于你做了什么的详细信息吗?你说的在关闭连接之前返回处理者是什么意思?同一艘船,“阻止处理者返回”是什么意思?似乎你救了我的命
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)