Как я могу закрыть канал/соединение WebSocket с серверной стороны правильно? Если я использую ctx.getChannel().close()
, то onerror
в Brwoser (Firefox 9) отбрасывается:Netty: Правильно закрыты WebSockets
Подключение к WS: // локальный: 8080/WebSocket была прервана, когда страница была загрузка
Я также попытался отправить CloseWebSocketFrame
в channelClosed
-метода в WebSocketServerHandler
:
public void channelClosed(ChannelHandlerContext ctx, ChannelStateEvent e)
throws Exception {
CloseWebSocketFrame close = new CloseWebSocketFrame();
ctx.getChannel().write(close);
}
Это бросает ClosedChannelException
(возможно, связанные to this?).
После того, как соединение WebSocket установлено, моя труба выглядит так: '[wsdecoder, wsencoder, webSocketHandler, myDecoder, myEncoder, app]'. Таким образом, WebSocketHandler пересылает данные в декодер, пока не достигнет приложения. Проблема в том, что 'app' ничего не знает о том, как он используется. Таким образом, он не знает, что в трубе вообще есть WebSocketHandler. Подобным образом, 'app' может использоваться и в других каналах с не-WebSocket-соединениями. Даже если я напишу «CloseWebSocketFrame» в приложении к «каналу», он будет закодирован до тех пор, пока он не достигнет «WebSocketServerHandler» – Dennis
. Я просто что-то протестировал: правильно ли это, что 'ch.write (...)' на любом слое трубы проходит через всю трубу (от последнего до первого обработчика)? Я ожидал, что он просто вернется из слоя, где мы делаем 'ch.write (...)' – Dennis
Из-за последнего поведения я представил класс ChannelClosing. Я пишу экземпляр этого на канале: 'ch.write (new ChannelClosing());'. Если я нахожу это в своем декодере (который преобразует данные моего приложения в WebSockets), я перехожу к 'CloseWebSocketFrame'. Оно работает. – Dennis