当您拥有活动的websocket连接时关闭浏览器时,以下行为似乎取决于浏览器:
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()的每个事件是否应关闭连接....