0

ピアツーピア アプリケーションを開発しています。各ピアには 1 つのサーバー ソケット チャネルと 1 つのソケット チャネルがあります..サーバー ソケット チャネルとソケット チャネルの接続を処理するには、2 つのセレクターが必要です.

SelectorProvider はシングルトン クラスのようであり、Selector の単一のインスタンスのみをフィクスします..これは両方のソケット チャネルに使用できません..

プログラムの 1 つのインスタンスで 2 つのセレクターを使用する方法はありますか?

private ServerSocketChannel svrScktChnl;
private SocketChannel socketChannel;

2 つのセレクター

public Selector selector=null;
public Selector playerSelector=null;

これらのセレクターをサーバーソケットチャネル用とソケットチャネル用に別々に初期化しようとしています..

しかし、エラーがスローされるため、もう一度初期化することはできません..

4

1 に答える 1

1

ここで、サーバー ソケット チャネルとソケット チャネルの接続を処理するために 2 つのセレクターが必要です...

いいえ、ありません。ここに記載されていない何らかの理由でそれらを別々のスレッドで処理したい場合を除き、同じセレクターを両方に使用できます。これは、実際には NIO が表すすべての違反です。

SelectorProvider はシングルトン クラスのようです

間違い。SelectorProvider.provider()シングルトンを返しますが、それを使用する必要はありません。独自のプロバイダーを指定できる API がどこにでもあります。次の理由により、関連性があるわけではありません。

Selector の 1 つのインスタンスのみに対応します。

間違い。「fices」が何を意味するのかはわかりませんが、呼び出すたびSelectorProvider.openSelector()に新しいを返します。これは、ここに質問を投稿して、間違っている可能性のある回答を永遠に待つという贅沢なテクニックがなくても、自分で発見できたはずです。Selectorプロバイダー自体がシングルトンであった場合、そうではありません。

..ソケットチャネルの両方に使用できません..

いいえ、実際に試したことがないことは明らかです。これは、自分で実験を行うことが期待される経験科学であることを理解する必要があります。インターネット サイトに質問を投稿して回答を待つことは、あなたや他の人の時間を効率的に使うことではありません。

それはエラーをスローします

そのようなわずかな情報で誰かがあなたを助けることを真剣に期待することはできません. 顧客からのバグレポートとしてそれを受け入れますか?

于 2012-10-03T09:51:36.527 に答える