我该如何正确地从服务器端关闭WebSocket通道/连接?如果我使用
ctx.getChannel().close()
,则浏览器(Firefox 9)中的onerror
会被抛出:The connection to ws://localhost:8080/websocket was interrupted while the page was loading。我还尝试在WebSocketServerHandler
中的channelClosed
方法中发送一个CloseWebSocketFrame
。public void channelClosed(ChannelHandlerContext ctx, ChannelStateEvent e)
throws Exception {
CloseWebSocketFrame close = new CloseWebSocketFrame();
ctx.getChannel().write(close);
}
这会抛出一个ClosedChannelException
异常(可能与此问题有关?)。
[wsdecoder,wsencoder,webSocketHandler,myDecoder,myEncoder,app]
。因此,WebSocketHandler将数据转发到解码器,直到它到达应用程序。问题是,app
不知道它的使用方式。因此,它根本不知道管道中是否有WebSocketHandler。这样,app
也可以在其他非WebSocket连接的管道中使用。即使我将CloseWebSocketFrame
写入channel
中的app
,它也会被编码,直到它到达WebSocketServerHandler
。 - Dennisch.write(...)
,它是否会通过整个管道(从最后一个处理程序到第一个处理程序)?我原以为它只会回到我们执行ch.write(...)
的那一层。 - DennisChannelClosing
的类。我在通道上写入该类的实例:ch.write(new ChannelClosing());
。如果我在解码器中(该解码器将我的应用程序数据转换为WebSockets)发现了它,我会切换到CloseWebSocketFrame
。这有效运行。 - Dennis