我正在使用websocket(来自dart:html
的套接字),我想知道当用户关闭浏览器或退出页面时是否可以发送消息。
我尝试了onClose
这样的事件:
ws = new WebSocket('ws://$hostname:$port/ws');
ws.onOpen.listen(onSocketOpen);
ws.onClose.listen((e) {
ws.send("I disconnected");
});
但它不会在这些特定情况下发送任何内容。或者,在我的服务器上我也尝试了这个,但使用onDone
事件:
WebSocketTransformer.upgrade(req)
..then((socket) => socket.listen((msg) => doSomething(), onDone:() => print("connection closed)));
这有效,但我想知道客户端断开连接(我之所以想从实际断开连接的客户端发送内容的原因)。
有理由这样做吗?我真的不想询问所有其他客户,以便在有人断线时他们是否仍然保持联系...
答案 0 :(得分:4)
在服务器端,我喜欢使用将特定连接与用户相关联的数据结构,然后我不需要客户端在关闭时识别自己,因为我可以找出它是哪个客户端使用触发onDone()的连接。最简单的方法可能是使用这样的地图:
Map<String, WebSocket>
在这种情况下,String是客户端ID(或其他)。它可以反过来做到这一点:
Map<WebSocket, String>
您的onDone()处理程序将传递一个WebSocket,您可以在数据结构中查找它以找出与之关联的客户端。
请注意,为了实现这一目标,您的客户需要在识别信息一旦连接后将其作为第一个业务订单发送。当他们这样做时,您只需在地图中创建关联。
清除泥土?
答案 1 :(得分:1)
据我所知window.onBeforeUnload
是正确的事件。这个事件处理程序允许有一些限制。例如,无法阻止窗口关闭。