2012-05-11 6 views
0

ServerBootstrap.bind()のコールはChannelを返しますが、これはConnectedステータスではないため、クライアントへの書き込みには使用できません。Netty:接続されたサーバーチャネルを取得するための呼び出しをブロックしますか?

channelConnectedのようなそのChannelHandlerのイベントからChannelにネッティードキュメント番組の書面でのすべての例 - 私はイベントに接続中のチャンネルではなく取得できるようにしたいが、イベント外の参考として、いくつかのクライアントを言うことができます私のサーバーコンポーネントを使用しているコード。 1つの方法は、手動でchannelConnectedイベントを待ってからコードを作成し、チャンネル参照をコピーすることです。しかし、これはホイールを再発明するかもしれません。

質問:接続されたチャンネルを返すNettyで利用可能なブロッキングコールはありますか?

編集:私はニオではなく、オオのチャンネルを使用しています。

+0

なぜですか?彼が接続するまで、あなたはクライアントにチャネルを得ることができず、それはあなたに接続イベントとして来る。なぜあなたは別の仕組みが必要だと思いますか?なぜブロック機構ですか?これは意味をなさない。 – EJP

+0

私は、クライアントが接続するまで接続されたチャンネルを取得できないことを知っています..それはまさに私がブロッキングを言及する理由です。何かを書くための接続されたチャンネルを望む外部インターフェースがあると言うことができます。サーバーはクライアントが接続してこの接続されたチャネルを返すまで待つ(ブロックする)必要があります。どの部分が意味をなさないのでしょうか? – Bhaskar

+0

それは意味がありません。クライアント接続の場合は、強制的に実行することはできません。到着した接続イベントを処理する必要があります。おそらくアウトバウンド*接続について話していますか?別の*サーバーに?* – EJP

答えて

2

ブロッキングコールを作成することもできますが、イベントベースのアプローチをあまりにも早く誤ったと思います。これはちょうど私があなたが何をしようとして理解を確認するために、不自然な例です:

  1. ネッティーServerは
  2. DataPusherサービスの開始を開始します。
  3. クライアントが接続すると、DataPusherはクライアントチャネルへの参照を取得し、それに何らかのデータを書き込みます。
  4. クライアントは接続直後にプッシュされたデータを受信します。

多かれ少なかれ正しいですか?

これを行うには、作成したサーバーパイプラインで、DataPusher(またはそれよりも優れたものの1つ)をChannelHandlerとして登録できます。それを延長するとorg.jboss.netty.channel.SimpleChannelHandlerになります。あなたはそれDataPusherの視点からブロッキング呼び出し作ると判断された場合は、ちょうどそれがラッチを待機して手先がラッチをドロップ持っている

DataPusher dataPusher = getMyDataPusherReference(); 

public void channelConnected(ChannelHandlerContext ctx, ChannelStateEvent e) { 
    dataPusher.doYourThing(e.getChannel()); // do something in another thread.... 
} 

:ハンドラは次のようになります。

あなたの探しているものがわからない場合.....

+0

あなたは多かれ少なかれ私のユースケースを理解した。ここで言及しているソリューションは、その問題は次のとおりです。DataPusherは簡単ではありません。それには一連の接続アクティビティがあり、このことはChannelHandlerモールドにその性質を絞ろうとするのではなく、書き込むチャネルを渡すことが最善であることを意味します。 – Bhaskar

+0

右。ハンドラは、単に「DataPusher」を意識することができるため、新しい接続が確立されたときと、DataPusherにチャネルを渡す方法の両方を認識します。また、ChannelGroup内のすべての接続されたチャンネルを登録して、DataPusherはChannelGroupへの参照と、新しいチャンネルが追加されたときの「軽いナッジ」を必要とするだけです。または.... ChannelGroupをオーバーライドして、独自のイベント処理を追加します。 – Nicholas

0

上記のすべての交換の後、私はまだこれが必要であるとは思わない。

あなたがしなければならないことは、外部サービスからの接続を受け入れるだけです。いかなるイベントのためにもそれを登録しないでください。他のクライアントが接続すると、両方のチャネルでI/Oイベントを登録します。

外部サービスは、別の接続を待っているスレッドでブロックされているのか、他の理由で応答していないのかを気にせず、気にしません。

もし彼があなたに書いているのであれば、あなたが実際に彼から読んでいない限り、ブロックしているかどうかにかかわらず、彼の書き込みはとにかく、あなたのソケット受信バッファのサイズまでは成功します。そのバッファがいっぱいになると、あなたがその一部を読むまでブロックされます。

あなたから読んでいる場合は、あなたが何かを送るまでブロックされ、その間にやっていることは彼には見えません。

だから、私はあなたの思考を単純化し、ノンブロッキングI/Oのすばらしい世界にもっと合わせる必要があると思います。

関連する問題