0

クライアントのように機能するC#アプリケーションがあり、パブリックインターネットに直接接続されているシステム(データカードまたはポート転送を介して)にインストールすることも、ルーターの背後にあることもできます(ポート転送なし)。

Java を使用して開発されたもう 1 つのアプリケーションは、公共のインターネット上にあるサーバー アプリケーションのように機能します。今、私の Java アプリケーションは、ルーターの背後にある C# アプリケーションにメッセージをプッシュしたいと考えています。Java アプリケーションには、クライアントのパブリックおよびプライベート (192.168.xx) IP アドレスがあります。Java アプリケーションは 24 時間年中無休で実行することになっています。

だから、今私には2つのオプションがあります:

  1. C# アプリケーションが起動するたびに、Java アプリケーションとのソケット接続が確立され、このソケット接続は C# アプリケーションが閉じられるまで開いたままになります。

  2. Java アプリケーションが C# アプリケーション用の何かを持っている場合は常に、C# アプリケーションとのソケット接続を作成し、メッセージをプッシュしてから接続を閉じます。

ここで、最初のオプションでは、何千ものクライアント アプリケーションが存在する可能性があるため、多くの不要な接続が発生するという問題があり、ある日、一部のクライアントにプッシュするものが何もなくなる可能性があります。2番目のオプションを選択する方法がわかりません。

このタスクを達成するための正しい方法は何ですか (オプション 1 または 2)?

UPnP プロトコルは 2 番目のオプションに適していますか? API (C# と Java) の両方を備えたオープン ソースの UPnP ライブラリは何ですか。ohnetと呼ばれるものを見つけました。それは私にとって正しいことでしょうか?OhNet でテストできる小さな例は 1 つも見つかりませんでした。

4

3 に答える 3

0

2)クライアント側でネットワーク構成を制御できない場合、実行できません。クライアントが適度に安全なファイアウォール/ルーターの背後にある場合、サーバーがクライアントに接続することは一般的に不可能です。

したがって、一般に、クライアントがサーバーへの接続を作成する1)のバリエーションを選択する必要があります。

ただし、必ずしも接続を開いたままにする必要はありません。クライアントにサーバーを定期的にポーリングさせて、新しい更新があるかどうかを確認することはいつでも可能です。

サーバーからクライアントへのリアルタイム更新が必要な場合でも、接続を開いたままにしておく必要があります。Java NIOを使用する場合、これは必ずしも問題ではありません。数万の同時着信接続を比較的簡単に処理できるはずです。

于 2012-10-29T09:24:16.297 に答える
0

ルーターに静的ルートを追加することにより、方法2を間違いなく使用します(ポート転送)。ただし、ルーターの背後にあるサーバーがネットワークの残りの部分 (DMZ) から保護されていることを確認する必要があります。

アップデート:

おそらく私はここで何かを見逃しています (方法 1 または 2) :-) - しかし、それを明確にするために: サーバーへの接続を開始するのは常にクライアントです。はい、クライアントがサーバーに定期的に更新を要求できるようにすることもできます。

于 2012-10-29T08:33:50.197 に答える
0

オプション 2 を使用すると、接続するまで C# クライアントのメッセージをキューに入れる必要がありますか? これにより、C# アプリケーションが接続されない場合、Java アプリケーションでメモリ不足の問題が発生する可能性があります。

于 2012-10-29T08:53:25.463 に答える