私はNetMQ(3.3.3.4)で手を加え、パブサブパターンを作成しています。NetMQ pub-subパターンがReceiveReadyで動作するようにすることができません
1つのポート(9000)のすべての受信データをリッスンし、別のポート(9001)のすべてのクライアント/サブスクライバにデータを転送する必要があります。
クライアントはその後、9000でデータを送信し、私は以下のコードのようなものを作成したドキュメントに続き9001
に(誰で)送信されたすべてのメッセージを受け取り、私はそれが仕事を得ることができないだろう。主に、私は信じています。ReceiveReady
は決して呼ばれません!私はそれが動作するはずと信じてどのように
:
client.Publish
に表示されるはずのデータが渡されていた場合、他のソケット- に沿ってデータのブロックを解除して渡すこと
host.SubscriberSocket_ReceiveReady
の最初の行を起こす必要がありますクライアントで無限のランニングTask
結果:
- のブレークポイントは
// This line is never reached
に到達しません。 - 例外はありません。
- それは= 9000をパブリッシュおよびサブスクライブして9001 =ホスト上のポートの切り替えは
- Windowsファイアウォールは、私が入れている場合、それは違いはありませんオフになっているので、任意の
- がブロックされてはならない効果がありません
PublisherSocket
コンストラクタに対処する、または私は間違って何をやっているクライアントにおけるホストで_publisherSocket.Bind(address)
または_publisherSocket.Connect(address)
を使用している場合は?
ホスト
public class MyNetMQHost {
private NetMQSocket _publishSocket;
private NetMQSocket _subscribeSocket;
private NetMQPoller _poller;
public MyNetMQHost(string publishAddress = "@tcp://localhost:9001", string subscribeAddress = "@tcp://localhost:9000") {
Task.Factory.StartNew(() => {
using (_publishSocket = new PublisherSocket(publishAddress))
using (_subscribeSocket = new SubscriberSocket(subscribeAddress))
using (_poller = new NetMQPoller { _publishSocket, _subscribeSocket }) {
_subscriberSocket.ReceiveReady += SubscriberSocket_ReceiveReady;
_poller.Run();
}
});
}
private void SubscriberSocket_ReceiveReady(object sender, NetMQSocketEventArgs e) {
var data = e.Socket.ReceiveMultipartBytes(); // This line is never reached
_publishSocket.SendMultipartBytes(data);
}
}
クライアント
public class MyNetMQClient {
private readonly NetMQSocket _publishSocket;
private readonly NetMQSocket _subscribeSocket;
public MyNetMQClient(string publishAddress = ">tcp://localhost:9000", string subscribeAddress = ">tcp://localhost:9001") {
_publishSocket = new PublisherSocket(publishAddress);
_subscribeSocket = new SubscriberSocket(subscribeAddress);
Task.Factory.StartNew(() => {
while (true) {
byte[] frameBytes = _subscribeSocket.ReceiveFrameBytes();
int one = 1; // This line is never reached
}
});
}
public void Publish(byte[] data) {
_publishSocket.SendFrame(data);
}
}
テスター
public class Tester {
public void MyTester() {
MyNetMQHost host = new MyNetMQHost();
MyNetMQClient client = new MyNetMQClient();
client.Publish(Encoding.Unicode.GetBytes("Hello world!");
}
}
XSub/XPubについてのドキュメントを読んだ後で、試行錯誤してもうまくいくと思います!ありがとう:) – GTHvidsten