我正在使用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)));
这有效,但我想知道哪个客户端断开连接(我想从实际断开连接的客户端发送一些东西的原因)。
有理由这样做吗?我真的不想查询所有其他客户端以了解当有人断开连接时它们是否仍然连接......
在服务器端,我喜欢使用将特定连接与用户相关联的数据结构,然后我不需要客户端在关闭时标识自己,因为我可以找出哪个客户端正在使用触发 onDone() 的连接。最简单的方法可能是使用这样的地图:
Map<String, WebSocket>
在这种情况下,字符串是客户端 ID(或其他任何内容)。甚至可以反过来做:
Map<WebSocket, String>
您的 onDone() 处理程序将向其传递一个 WebSocket,您只需在数据结构中查找它即可找出与之关联的客户端。
请注意,要使其正常工作,客户端需要在连接后将标识信息作为首要任务。当他们这样做时,您只需在地图中创建关联。
清澈如泥?
我所知window.onBeforeUnload
是正确的事件。此事件处理程序允许有一些限制。例如,无法阻止窗口关闭。
- https://developer.mozilla.org/en-US/docs/WindowEventHandlers.onbeforeunload
- 使用 jQuery 在 Chrome 和 IE 中的 body 元素上设置 onbeforeunload