2

2つのエンティティ間でシグナルとデータを送信する必要があるアプリケーションがあります。ベストプラクティスとその理由はどちらですか?

  1. 4つのソケットを開きます。2つは両方向の信号用、2つは両方向のデータ用です。
  2. データと信号用にそれぞれ2つのソケットを開きます
  3. 1つのソケットを開き、信号とデータをフィルタリングするだけです
4

4 に答える 4

2

まず、ソケットは全二重です。つまり、送信と受信に個別のソケット(接続)は必要ありません。

第二に、詳細を説明せずに判断するのは困難です。ただし、HTTP(コマンド/ヘッダーとデータの1つの接続)とFTP(コマンドとデータの個別の接続)の履歴を知っていると、HTTP設計者がより適切な選択をしたように見えます。2つの接続は維持するためのより多くのコードです。また、一部のファイアウォールは、データの大部分が転送されるときに、ハングしたアイドル状態のFTPコマンド接続を好みません。

したがって、1つの接続を選択すると、信号とデータ(フラグ、ヘッダーなど)を簡単に区別できます。また、着信チャネルと発信チャネルは完全に直交しています。

于 2012-10-20T12:30:00.133 に答える
0

別の方法: 0MQのようなリアルタイムアプリケーション用に構築された専用のミドルウェアを使用します。

ØMQをインスタンス化するには:

Jzmq obj = new Jzmq (hostname);

ここで、hostnameは、zm​​q_serverが実行されているボックスの名前またはIPアドレスです。

配線を作成するには、createExchange、createQueue、およびbind関数を使用できます。配線機構の仕組みの詳細については、こちらをご覧ください。

int eid = obj.createExchange ("E", Jzmq.SCOPE_GLOBAL, "10.0.0.1:5555");
obj.createQueue ("Q", Jzmq.SCOPE_GLOBAL, "10.0.0.1:5556");
obj.bind ("E", "Q");

メッセージの送信は非常に簡単です。メッセージはバイト配列の形式で提供されます。

byte msg [] = {1, 2, 3, 4, 5, 6};
obj.send (eid, msg);

メッセージの受信はさらに簡単です。

byte [] msg = obj.receive ();

完全なサンプルはこちらから入手できます

于 2012-10-20T18:30:11.677 に答える
0

すべてのデータ用に1つのソケット、すべての信号用に1つのソケットを用意できないのはなぜですか。同じソケットからリモートエンティティからの信号を読み取りながら、リモートエンティティに信号を送信できます。これは、FTP(非パッシブ)がどのように機能するかのようなもので、制御接続があり、実際のデータ転送に使用されます。

ソケットが4つあるのはやり過ぎのようですが、信号やデータが何であるかはわかりません。

ネットワーク通信をデコードするためのコードを増やしてもかまわない場合は、すべてを1つのソケットで確実に実行できます。実際のコミュニケーションについてもっと考える必要があります。必要に応じて、より適切な「プロトコル」を使用してください。2ソケットモデルと1ソケットモデルの両方で問題ありません。

于 2012-10-20T12:30:08.857 に答える
0

考えられる「中道」があります。JBossリモーティングなどを使用して、1つの実際のソケットの上に複数の仮想ソケットを多重化します。このようにして、アプリケーションレベルでデータチャネルと制御チャネルを分離し、オペレーティングシステムレベルで必要なTCPポートは1つだけ(したがって、ファイアウォールの穴は最大1つ)にすることができます。

于 2012-10-20T12:40:38.247 に答える