我尝试实施NetMQ发布/订阅模型,但订阅者未收到任何消息。这可能有什么问题?
private static void ServerTask()
{
using (var context = NetMQContext.Create())
{
using (var socket = context.CreateSubscriberSocket())
{
socket.Bind("tcp://10.120.19.109:5000");
socket.Subscribe(string.Empty);
while (true)
{
Thread.Sleep(100);
string receivedMessage = socket.ReceiveString();
Console.WriteLine("Received: " + receivedMessage);
}
}
}
}
public static void ClientTask()
{
using (NetMQContext ctx = NetMQContext.Create())
{
using (var socket = ctx.CreatePublisherSocket())
{
socket.Connect("tcp://10.120.19.109:5000");
string obj = "hi";
socket.Send(obj);
}
}
}
两者都在不同的应用中。
答案 0 :(得分:2)
如果您是NetMQ的新手,我建议您阅读zeromq指南http://zguide.zeromq.org/page:all。
底线是您在订阅者发送订阅之前发送消息。
zeromq和NetMQ中的Pubsub就像收音机一样,你只会在你开始听的那一刻收到消息。
要做到这一点(不是现实生活中的解决方案)的简单方法是在连接后睡一段时间。
对于现实生活中的解决方案,我需要了解你想要实现的目标
答案 1 :(得分:0)
问题就像
using (NetMQContext ctx = NetMQContext.Create())
{
using (var publisher = ctx.CreatePushSocket())
{
publisher.Bind("tcp://localhost:5000");
int i = 0;
while (true)
{
try
{
publisher.Send(i.ToString(), dontWait:true);
Console.WriteLine(i.ToString());
}
catch (Exception e)
{
}
finally
{
i++;
}
}
}
现在,此代码有效。但是如果我把我的while(true)循环移到外面。并从其他函数中调用此代码,这会强制每次都将push socket和context创建为new ..这不起作用。