2012-01-09 7 views
10

nettyとiosを使用してサーバークライアントアプリケーションを構築していますが、ユーザーがiosデバイスのWiFiをオフにしたときに問題が発生しました。 サーバーは、そのユーザーのクリーンアップを行い、オフラインに設定することを知っておく必要がありますが、ユーザーが再び接続しようとすると、サーバーは既にオンラインになっていると通知します。Netty Channel closed detection

答えて

13

私が正しくあなたの問題を理解している場合:あなたは、クライアントチャネルをリッスンするサーバ側のイベントを閉じて、いくつかのセッションのクリーンアップを行い、

チャネルをリッスンするには、2つの方法がありますが網状にイベントを閉じて:

サーバーハンドラがSimpleChannelHandler/SimpleChannelHandlerを拡張する場合は、チャネル参照へのアクセスのみを持っている場合は1)、その後することができますグラム、)あなたは、次のメソッドをオーバーライドすることができますし、

public void channelClosed(ChannelHandlerContext ctx, ChannelStateEvent e) throws Exception; 
にあり

2をお使いのセッションクリーンアップ・ロジックを書きますらチャネル近い将来とは、あなたのセッションのクリーンアップ・ロジックと

ChannelFuture closeFuture = channel.closeFuture(); 

closeFuture.addListener(new ChannelFutureListener() { 
    @Override 
    public void operationComplete(ChannelFuture future) throws Exception { 
     //session cleanup logic 
    } 
}); 
+3

私はchannelClosedメソッドを実装していますが、ユーザーがアプリケーションを閉じたときにうまく動作しますが、ユーザーがWi-Fi接続を失っただけではこのメソッドは呼び出されません。 –

+2

最適なアイドルタイムアウトを持つIdleStateHandlerを追加する方が良いでしょう。ユーザーがその時間を超えてアイドル状態になっている場合は、おそらく接続が失われている可能性があります。そのため、サーバーハンドラからのIdleStateEventの接続を閉じます。 –

+3

新しいバージョンのNettyでは、 'getCloseFuture()'は 'closeFuture()'のようです。 – childofsoong

1

チェックセッションIDをChannelFutureListenerの実装を登録し、再交渉が可能。あるいは、クッキーコントローラのようなものを使うかもしれません。 トピックの質問から尋ねることができます:iosのクライアントはどのようにNettyサーバーとやりとりしますか? (どのようなフレームワークを使用すると、クライアント側で使用し、そしてどのようなデコーダ/エンコーダ使用?)

3

使用IdleStateHandler

所定の時間間隔には、要求/応答がないときは、検出することができます。