WebSocketのチャンネル/接続をサーバー側から正しく閉じるにはどうしたらいいですか?私はctx.getChannel().close()
を使用する場合は、Brwoser(Firefoxの9)でonerror
がスローされます。Netty:WebSocketを正しく閉じる
WSへの接続:// localhostを:ページが
をロードしている間に8080 /のWebSocketが中断された、私も試してみましたWebSocketServerHandler
にchannelClosed
-method内CloseWebSocketFrame
を送信します
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'を' channel'に書き出しても、 'WebSocketServerHandler'に到達するまでエンコードされます – Dennis
何かをテストしたばかりです:' ch.write(...) 'パイプのどのレイヤーでも(最後のハンドラから最初のハンドラまで)パイプ全体を通過しますか?私は 'ch.write(...)'を行うレイヤーから戻ってくることを期待しました – Dennis
最後の動作のために、私は 'ChannelClosing'クラスを導入しました。私はチャネル上でこのインスタンスを書いています: 'ch.write(new ChannelClosing());'。私のデコーダ(私のアプリケーションデータをWebSocketsに変換する)でこれを見つけると、私は 'CloseWebSocketFrame'に切り替えています。できます。 – Dennis