Websocket:关闭浏览器触发chrome中的onError(),但触发Firefox中的onClose()事件

时间:2014-05-11 23:53:13

标签: internet-explorer google-chrome firefox websocket

当您拥有活动的websocket连接时关闭浏览器时,以下行为似乎取决于浏览器:

  • Firefox:触发onClose()。
  • Internet Explorer:触发onClose()。
  • Chrome:会触发onErr(),throwable似乎不包含a CloseReason。

    01:22:47,428 ERROR [stderr](默认任务-5)java.nio.channels.ClosedChannelException        01:22:47,429 ERROR [stderr](默认任务-5)at io.undertow.server.protocol.framed.AbstractFramedChannel.receive(AbstractFramedChannel.java:253)        01:22:47,429 ERROR [stderr](默认任务-5)at io.undertow.websockets.core.AbstractReceiveListener.handleEvent(AbstractReceiveListener.java:20)        01:22:47,429 ERROR [stderr](默认任务-5)at io.undertow.websockets.core.AbstractReceiveListener.handleEvent(AbstractReceiveListener.java:15)        01:22:47,429错误[stderr](默认任务-5)atg.xnio.ChannelListeners.invokeChannelListener(ChannelListeners.java:92)        01:22:47,429 ERROR [stderr](默认任务-5)at io.undertow.server.protocol.framed.AbstractFramedChannel $ FrameReadListener.handleEvent(AbstractFramedChannel.java:615)        01:22:47,429 ERROR [stderr](默认任务-5)at io.undertow.server.protocol.framed.AbstractFramedChannel $ FrameReadListener.handleEvent(AbstractFramedChannel.java:601)        01:22:47,429错误[stderr](默认任务-5)atg.xnio.ChannelListeners.invokeChannelListener(ChannelListeners.java:92)        01:22:47,429 ERROR [stderr](默认任务-5)atg.xnio.conduits.ReadReadyHandler $ ChannelListenerHandler.readReady(ReadReadyHandler.java:66)        01:22:47,429错误[stderr](默认任务-5)atg.xnio.nio.NioSocketConduit.handleReady(NioSocketConduit.java:87)        01:22:47,430 ERROR [stderr](默认任务-5)atg.xnio.nio.WorkerThread.run(WorkerThread.java:531)

我试图找一个解决方法,捕获onbeforeunload事件......

window.onbeforeunload = function () {
            console.log("closing window");
            return null;
        }

...但看起来,目前的Chrome版本无法做到这一点。

为什么Chrome会触发onError(),而不是关闭连接?当用户关闭浏览器窗口时,我不认为这是一个错误。大多数情况下,不再需要Web服务,因此用户将关闭窗口。

另外,请看这个帖子: Should WebSocket.onclose be triggered by user navigation or refresh?

如果触发了onError(),我必须调用OnClose(),因为当Chrome用户关闭窗口时我无法关闭连接。

@OnError
    public void onErr(Throwable t) {
        onClose(this.container.getWsSession(), null);

    }

我不确定触发onError()的每个事件是否应关闭连接....

0 个答案:

没有答案