2012-01-23 5 views
4

WebSocketのチャンネル/接続をサーバー側から正しく閉じるにはどうしたらいいですか?私はctx.getChannel().close()を使用する場合は、Brwoser(Firefoxの9)でonerrorがスローされます。Netty:WebSocketを正しく閉じる

WSへの接続:// localhostを:ページが

をロードしている間に8080 /のWebSocketが中断された、私も試してみましたWebSocketServerHandlerchannelClosed -method内CloseWebSocketFrameを送信します

public void channelClosed(ChannelHandlerContext ctx, ChannelStateEvent e) 
     throws Exception { 
    CloseWebSocketFrame close = new CloseWebSocketFrame(); 
    ctx.getChannel().write(close); 
} 

これはClosedChannelExceptionスロー(多分関連to this?)。

答えて

4

あなたはこれをしなければならない。

ch.write(new CloseWebSocketFrame()); 

は、サーバが接続を閉じます。間もなく接続が閉じられない場合は、 ch.close()に電話することができます。 CloseWebSocketFrameを送信し、その後にチャンネルを閉じる必要がありますどの程度

ctx.getChannel().write(new CloseWebSocketFrame()).addListener(ChannelFutureListener.CLOSE); 

+0

WebSocket接続が確立されると、私のパイプは次のようになります: '[wsdecoder、wsencoder、webSocketHandler、myDecoder、myEncoder、app]'したがって、WebSocketHandlerは、データがアプリケーションに到達するまでデコードにデータを転送します。問題は、 'app'はそれがどのように使われているかについて何も知らないということです。したがって、パイプにWebSocketHandlerがあることはまったく分かりません。このように、 'app'は非WebSocket接続を持つ他のパイプでも使うことができます。アプリケーションの 'CloseWebSocketFrame'を' channel'に書き出しても、 'WebSocketServerHandler'に到達するまでエンコードされます – Dennis

+0

何かをテストしたばかりです:' ch.write(...) 'パイプのどのレイヤーでも(最後のハンドラから最初のハンドラまで)パイプ全体を通過しますか?私は 'ch.write(...)'を行うレイヤーから戻ってくることを期待しました – Dennis

+2

最後の動作のために、私は 'ChannelClosing'クラスを導入しました。私はチャネル上でこのインスタンスを書いています: 'ch.write(new ChannelClosing());'。私のデコーダ(私のアプリケーションデータをWebSocketsに変換する)でこれを見つけると、私は 'CloseWebSocketFrame'に切り替えています。できます。 – Dennis

0

どのバージョンをお使いですか?

ctx.getChannel().write(ChannelBuffers.EMPTY_BUFFER).addListener(ChannelFutureListener.CLOSE); 

あなたは、この藤堂試みたことがありますか?

+0

Nope。それでも 'ClosedChannelException'。 'CloseWebSocketFrame'のコンストラクタには' ChannelBuffers.EMPTY_BUFFER'が含まれています。私は 'CloseWebSocketFrame'を使う必要があると思います。 – Dennis

+0

RFC 6455(http://tools.ietf.org/html/rfc6455#section-7.4.1)で定義されています。* 1001は、サーバーがダウンしているか、ブラウザーがナビゲートしているなど、エンドポイントが「去っている」ことを示します*これは私が使いたいものです。 – Dennis

+0

バージョン:私の支店(https://github.com/boldt/netty)を使用しています。 Nettyはモジュール化されているので、もうコンパイルできません。 – Dennis

関連する問題