0

私はさまざまなことを試しましたが、これは本質的に私がやろうとしていることです。進行中の pubsub をセットアップします。このコードを再実行したところ、pub ソケットをフォワーダー デバイスのフロント エンドに接続しようとすると、接続が拒否されました。

ここにコードがあります

string expectedAddress = "XXXX";
        string message = "hello its me";
        int count = 0;
        using (var context = ZmqContext.Create())
        {
            using (var forwarderDevice = new ForwarderDevice(context, "inproc://front", "inproc://back", DeviceMode.Threaded))
            {
                using (var pub = Helper.GetConnectedPublishSocket(context, "inproc://front"))
                {
                    using (var sub = Helper.GetConnectedSubscribeSocket(context, "inproc://back")) 
                    {
                        forwarderDevice.Start();

                        Helper.SendOneSimpleMessage(expectedAddress, message, pub);

                        var zmqMessage = Helper.ReceiveMessage(sub);

                        Assert.AreEqual(count, zmqMessage.FrameCount);
                        Frame frame = zmqMessage[0];
                        var address = Encoding.Unicode.GetString(frame.Buffer);
                        Assert.AreEqual(expectedAddress, address);
                    }
                }
                forwarderDevice.Stop();
            }
        }

わかりました最初に私が間違っていることを知っています...接続を試みる前に、デバイスの作成直後に開始する必要があります。2 つ目は、デバイスが別のスレッドで開始され、メイン スレッドが接続を試みるまでに準備ができていない可能性があるため、準備が整うまで何らかの方法でブロックする必要があることです。コードは次のようになります。

string expectedAddress = "XXXX";
        string message = "hello its me";
        int count = 0;
        using (var context = ZmqContext.Create())
        {
            using (var forwarderDevice = new ForwarderDevice(context, "inproc://front", "inproc://back", DeviceMode.Threaded))
            {
                forwarderDevice.Start();
                while (!forwarderDevice.IsRunning)
                { }

                using (var pub = Helper.GetConnectedPublishSocket(context, "inproc://front"))
                {
                    using (var sub = Helper.GetConnectedSubscribeSocket(context, "inproc://back")) 
                    {
                        Task<ZmqMessage> task = Task.Run(() =>
                            {
                                var zmqMessage = Helper.ReceiveMessage(sub);
                                return zmqMessage;
                            });

                        Helper.SendOneSimpleMessage(expectedAddress, message, pub);
                        task.Wait();

                        var result = task.Result;

                        Assert.AreEqual(count, result.FrameCount);
                        Frame frame = result[0];
                        var address = Encoding.Unicode.GetString(frame.Buffer);
                        Assert.AreEqual(expectedAddress, address);
                    }
                }
                forwarderDevice.Stop();
            }
        }

エラーは発生していませんが、メッセージも受信しません

4

1 に答える 1

0

後者のコードを見ると、古典的な SUB エラーは、実際には何もサブスクライブしないことです。すべてのメッセージを取得するには、SUBSCRIBE を "" (空の文字列) に設定する必要があります。したがって、それが PUB/SUB ソケット ペアである場合、ヘルパーをサブスクライブしない限り、メッセージをフィルタリングするだけです。

于 2013-03-08T11:55:27.513 に答える