【问题标题】:Dart websocket - sending information before disconnectingDart websocket - 在断开连接之前发送信息
【发布时间】:2014-11-21 19:00:49
【问题描述】:

我正在使用 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)));

这行得通,但我想知道哪个客户端断开了连接(我想从实际断开连接的客户端发送一些东西的原因)。

有这样做的理由吗?当有人断开连接时,我真的不想查询所有其他客户端以了解他们是否仍然连接......

【问题讨论】:

    标签: websocket dart


    【解决方案1】:

    在服务器端,我喜欢使用将特定连接与用户相关联的数据结构,然后我不需要客户端在关闭时识别自己,因为我可以确定它正在使用哪个客户端触发 onDone() 的连接。最简单的方法可能是使用这样的地图:

    Map<String, WebSocket>

    在这种情况下,字符串是客户端 ID(或其他)。甚至可以反过来做:

    Map<WebSocket, String>

    您的 onDone() 处理程序将有一个 WebSocket 传递给它,您可以在您的数据结构中查找它以找出与之关联的客户端。

    请注意,要使此功能生效,您的客户需要在连接后将识别信息作为第一笔业务发送。当他们这样做时,您只需在您的地图中创建关联。

    一清二楚?

    【讨论】:

    • 这是您通常的做法。 +1
    • @montyr75 我不确定在监听初始连接时如何注册该数据结构。在客户端,我可以收听open 事件,但似乎套接字已经打开。在服务器端,我认为我没有来自客户端的任何信息(在 WebSocketTransformer.upgrade 方法中
    • Nvm 我想我想通了。建立连接后,我可以使用socket.send() 从客户端发送数据结构,然后在服务器端,我可以从listen 接收它并将socket 对象与实际数据结构相关联。跨度>
    【解决方案2】:

    据我所知window.onBeforeUnload 是正确的事件。此事件处理程序允许的内容有一些限制。例如,无法阻止窗口关闭。

    【讨论】:

    • 在现代浏览器中,当用户离开页面时在 onbeforeunload/unload 处理程序中启动 xhr 时,连接通常在完成之前关闭。我认为这与 websocket 类似。一种解决方法是使用同步 xhr,但这可能对用户体验非常不利。在大多数浏览器中,同步 xhr 正在被贬值。正在开发一个名为 navigator.sendBeacon() 的新 Web api,旨在解决此用例。但它仅在一些最新的浏览器中受支持。
    猜你喜欢
    • 2012-04-20
    • 1970-01-01
    • 2015-05-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多