2017-01-26 15 views
0

pls。私と一緒に裸でください。私はNettyが初めてです。2つのNettyサーバーを1つのサーバーに結合します

OSGiプラグインで実行されているNettyサーバー(基本的にNettyの例ObjectEchoServerから取得)があります。サーバーはポート51515にバインドされており、必要な方法で動作しています。これまでの基本的な考え方を理解しています。

今私もpluginに「組み込みHttp」サーバを追加する必要があります。私はNettyの例からHTTPServerを削除し、それを変更して私のニーズを満たすようにしました。サーバーは別のポート51516にバインドされています。

2つのサーバーを一緒に持っていくのに助けが必要です。どちらのサーバーもハンドラが異なります。

ObjectEcho

extends SimpleChannelInboundHandler<Object> 

HTTPServerの

extends SimpleChannelInboundHandler<FullHttpRequest> 

は、それが両方のサーバーのために使用することができる唯一のハンドラを持つことは可能ですが?

私が達成したいのは、両方のサーバーが1つのポートしか使用しないということです。

答えて

0

まだ2つの異なるポートがある場合は、Java遺産で独自の「ビジネス」ハンドラを構築し、最初にプロトコルハンドラ(エコー1とhttp 1)を追加してから自分のビジネスハンドラを追加できます。

当然ながら、このビジネスハンドラに渡す可能性のあるオブジェクトは、エコーハンドラやhttpハンドラが初めて行うときと同じであるため、すべてがオブジェクトに依存します。ところで

が、それは...「ビジネス」のハンドラから「プロトコル」を分離することをお勧めし

更新応答:両方のサーバーのあなたのパイプラインで

、(2つのポート)まずSimpleChannelInboundHandlerの代わりにChannelDuplexHandlerの拡張子を使用して "プロトコル"ドライバを追加してから、独自のビジネスハンドラ(SimpleChannelInboundHandlerに基づいて)を追加します。

プロトコルビジネスから、目的のオブジェクトを受信ビジネスハンドラに転送して、ChannelDuplexHandlerに変換するためにオブジェクトを戻します。

このようにして、プロトコル(コーデック)とビジネスを分離します。

あなたが望むものではない場合でも、それを行う方法を示すexample/src/main/java/io/netty/example/spdy/clientを見ることができます(クライアント側、サーバー側まったく同じ原理です)。

セカンド更新:あなたは、プロトコルの正しい種類をindentifyする最初のバイトを分析する前のChannelDuplexHandlerをHACEする必要がありますので、

は一つのポートだけを持っているが、それはより複雑です。次に、必要なハンドラ(プロトコルとビジネス)をパイプラインに動的に渡すことができます。

まず、パイプラインにはハンドラが1つだけあり、使用するプロトコルを決定するものです。

ただし、これは困難な場合があります。プロトコルを保証する最初のバイトに明白な違いがある場合を除いて、プログラムが確定的でなければならないため、2つのポートを持つ以外は実際の解決策はありません。

+0

エコーの場合、すべてのオブジェクトはPOJOであり、EchoHandlerがサーバー上で要求をトリガーするために使用する文字列を含んでいます。サーバーは文字列を返します。 –

+0

HTTP部分がHTTPRequestを受け取り、ログ(テキストファイル)からHTMLページビルドを返します –

+0

擬似コードを投稿できますか?これは私に良い理解を与えるだろう –

関連する問題