2011-09-14 13 views
1

私はnettyを使ってクライアントサーバーの例を作った。 サーバーとクライアントのハンドラを定義しました。 基本的には、クライアントとサーバーに接続してメッセージを送信します。 すべての受信メッセージが返送されます(メッセージの内容は大文字に変換されます)。 受信したメッセージのすべての作業は、サーバー側とクライアント側で、定義されたハンドラーによって行われます。受信したメッセージをクライアントで直接処理する(netio-frameworkを使って)。

しかし、私はクライアントのメッセージを直接受信/受信する方がいいです。 ハンドラ内に(まったく)ありません。だから私の質問は、ハンドラではなく、クライアントプログラムで直接メッセージを受信するリスナを持つことが可能なことです。新しいクライアントオブジェクトを作成した(実行可能な)プログラム(基本的にはメインメソッドを持つクラス)内の受信メッセージにアクセスしたいと思っています。定期的に新しいものをチェックするタイマー(またはループ)メッセージ。

誰かがこの問題について私に助けてくれたらと思います。それともネットでも可能かどうかを教えてください。

答えて

1

あなたは、nettyのイベントベースモデルをポーリングモデルに変換しようとしています。それを行うための簡単な方法メッセージキューを作成することです:

//import java.util.concurrent.BlockingQueue; 
//import java.util.concurrent.LinkedBlockingQueue; 
BlockingQueue queue = new LinkedBlockingQueue(); 

あなたは、コンストラクタの引数としてハンドラへのキューが利用できるようにする必要があり、そしてメッセージは、キューに入れて到着したとき:

// Your netty handler: 
queue.put(message); 

クライアント側では、あなたがメッセージのキューをポーリングすることができますが:

// The polling loop in your program: 
message = queue.poll(5, TimeUnit.SECONDS); 

BlockingQueueはあなたに到着するメッセージを待っている間の選択を提供しています((poll(long, TimeUnit))、または現在使用可能なメッセージがあるかどうかを確認するだけである(poll())かどうかを確認する必要があります。

デザインの観点から、このアプローチは、あなたに与えると思われるノンブロッキングIOの利点を殺します。同じネット結果に対して通常のSocket接続を使用している可能性があります。

+0

thx。基本的に私が今実装したものです。それはあなたがそれを使用する必要がある利点を殺す(私はいくつかのさらなるメッセージ処理を実装したくないので) – c3p0

関連する問題