1

異なるプラットフォームの2つの異なるアプリケーションが相互に通信するのに役立つサーバーのコードを書いています。少し視覚化すると、次のようになります。

App1<------>サーバー<------>App2

サーバーが行うことは、app2からvar1をリアし、app1に書き込み、次にapp1からvar2を読み取り、app2に書き込みます。このような :

while(true){
var1 = app2stream.readInt();
app1stream.writeInt(var1);
var2 = app1stream.readDouble();
app2stream.writeDouble(var2);
}

私の問題は、ある時点でサーバーにこのコードがあることです。

app1.accept();
app2.accept();

これが意味することは、何があっても、サーバーが常に実行されているという事実を考えると、app1.accept()はブロッキングメソッドであるため、app1が最初に接続する必要があるということです。

これを回避する方法はありますか?誰が最初に「来た」かに関係なく、2つのアプリケーションがサーバーに接続できるようにしてから、サーバーが上記のコードを続行するのを待つのは素晴らしいことです。accept()部分だけにスレッドを使用してから、ストリームを他のスレッドに渡すことはできますか?私はチャンネルについて少し読みましたが、少し混乱しました。どんな例でも素晴らしいでしょう。

4

4 に答える 4

1

NIOを使用する

Selectorこれにより、クラスを使用して非ブロッキングソケット(受け入れを含む)を実行できます。

基本的に、システムライブラリへのネイティブアクセスが大幅に増え、マルチスレッドを使用せずにタスクを処理できるようになります。

于 2011-04-05T16:53:15.607 に答える
1

1つの受け入れ呼び出しと1つのサーバーソケットのみがあります。接続したら、どのアプリが接続したかを判断できます。接続の詳細から取得できない場合は、アプリにマップできる認証コード(とにかく良いアイデア)を送信してもらいます。

于 2011-04-05T16:39:59.003 に答える
0

これを行う「標準的な」方法は、サーバーにポートをリッスンさせることだと思います。メッセージが着信したら、すぐに新しいスレッドをスピンオフして処理し、別のメッセージのリッスンに戻ります。次に、Glowcoderが言うように、同じループ内ですべての接続を行い、接続後にどちらがどちらであるかを判断します。

別の方法は、それぞれが異なるポートでリッスンする複数のスレッドを持つことだと思います。私はそれを試みたことがありません。接続が確立されるまでブロックされるかどうかわからないため、他のスレッドにアクセスすることはありません。

于 2011-04-05T16:47:14.983 に答える
0

特に断りのない限り、おそらく両方を同じように扱う必要があります。

たとえば、各ソケットが接続するときに、「どのクライアント?」を送信します。メッセージ。

次に、クライアントが1または2で応答するかどうかを確認します。

両方が1か何かで応答する場合は、両方を切断します。

于 2011-04-05T16:36:56.177 に答える