14

次の問題に直面しています。

クライアント (最終的には n クライアント) があり、サーバーに接続するのが好きです。クライアントはサーバー/ホストのアドレスを知っていますが、サーバーはクライアントのアドレスを知りません。クライアントとサーバーの間で次のメッセージング パターンを実現できるようにしたいと考えています (クライアントとサーバーの両方が、次のメッセージ パターンを実現できる必要があります)。

  • メッセージを公開する (返信なし)
  • メッセージの受信 (返信なし)
  • メッセージの要求/受信 (応答が期待されます)
  • ストリーム メッセージ (上記のパブリッシュ メッセージ パターンを介して提供される可能性があるため、これは冗長である可能性があります)

ここでも重要なポイントであり、私が苦労しているのは、メッセージを送受信しながらホストに接続する方法です。ホストにはクライアントに接続する機能がなく、クライアント接続要求のみを受け入れることができます。クライアントとサーバーの両方が接続するプロキシ/ブローカーを使用したソリューションを探していないことに注意してください。それ以外の場合は、rabbitmq などのソリューションを直接使用できます。

コードサンプルを参照して、これを最もよく達成するにはどうすればよいですか。

どうもありがとう。

4

1 に答える 1

14

DEALERサーバーに接続するには、クライアント側にソケットが必要で、サーバーにもソケットが必要ROUTERです。パブリッシュ サブスクライブ パターンが必要なためSUB、クライアント側にソケットが必要PUBで、サーバー側にもソケットが必要です。

  Client       Server
+-------+      +--------+
| Dealer| <--> | Router |
|  Sub  | <--  |  Pub   |
+-------+      +--------+

したがって、Router と Pub ソケットをバインドし、Dealer と Sub ソケットを接続します。あなたがしたいときよりも:

  • メッセージの公開 (返信は期待されません): エンベロープ (pub、channel、message) を作成し、Dealer 経由で送信します。ルーター側では、ルーターは次のエンベロープ (dealer、pub、channel、message) を受信するため、公開できます。 PUB ソケットを介したチャネル上のメッセージ。

  • メッセージの受信 (応答は期待されません):SUBクライアント側のソケットで行われ、すべてのパブリケーションが ROUTER を通過するため、サブスクリプション メカニズムを簡単に実装したりSUB、サーバー側にソケットを追加して接続 (インプロセス) したりできます。PUBソケット(おそらくこれはよりクリーンなソリューションです)。

  • メッセージの要求/受信 (応答が期待されます): ディーラー - ルーターで実行できます。別のエンベロープ ( req, message ) を作成するだけで、Router ( receive: deal, req, message ) はそれを処理する必要があることを認識し、ディーラーに返信を送信できます。サーバーがクライアントにリクエストを送信する必要がある場合は、接続されているクライアントを追跡し、エンベロープ (dealer、req、msg) を送信するだけで済みます。これにより、ディーラーは ( rep、message ) エンベロープの例で応答できます。

  • ストリーミング:あなたが述べたように、公開パターンで実行できます

これは私が行う方法です。心臓の鼓動が必要な場合、少し複雑になりますが、それほど多くはありません.

于 2013-06-10T08:47:45.027 に答える