NetMQ - 消息仅适用于回复传入消息,不适用于其他端口
NetMQ - messages only work on reply to incoming message, not to other port
在初始化我的路由器应用程序时,我调用了以下代码。它绑定良好,接收消息正常但拒绝为 On_ReceiveXXX 方法工作,除非它是直接响应。我想知道为什么
public void Initialize(string frontEndAddress, string backEndAddress)
{
_poller = new Poller();
_timeAllowedBetweenPings = TimeSpan.FromMinutes(1);
_lastPingResponse = DateTime.Now;
using (var ctx = NetMQContext.Create())
{
_frontEnd = ctx.CreateRouterSocket();
_backEnd = ctx.CreateRouterSocket();
_frontEnd.Bind(frontEndAddress);
Console.WriteLine(string.Format("[Router]: Connected to {0}", frontEndAddress));
_backEnd.Bind(backEndAddress);
Console.WriteLine(string.Format("[Router]: Connected to {0}", backEndAddress));
_frontEnd.ReceiveReady += On_ReceiveFrontEnd;
_backEnd.ReceiveReady += On_ReceiveBackEnd;
_poller.AddSocket(_frontEnd);
_poller.AddSocket(_backEnd);
var timer = new NetMQTimer(TimeSpan.FromSeconds(1));
timer.Elapsed += On_Ping;
_poller.AddTimer(timer);
_poller.PollTillCancelled();
}
}
调用经销商 ReceiveReady 事件失败:
private void On_ReceiveFrontEnd(对象发送者,NetMQSocketEventArgs e)
{
_lastPingResponse = DateTime.Now;
var frontEndMsg = e.Socket.ReceiveMultipartBytes();
var streamData = frontEndMsg.Last();
ApplicationMessage msg = PackageHelper.DeserializeOutgoing(streamData);
Console.WriteLine(string.Format("Command received: {0}", msg.CO));
_backEnd.SendMultipartBytes(frontEndMsg);
}
但是如果我换行
_backEnd.SendMultipartBytes(frontEndMsg);
至
_frontEnd.SendMultipartBytes(frontEndMsg);
它突然起作用了...所以来自我的前端应用程序的消息只能得到响应,而不能传递到后端应用程序。反之亦然,对于后端消息。
使用路由器时,第一帧是路由 ID,它特定于套接字。所以你不能将整个消息从一个路由器传递到另一个路由器。将后端更改为经销商,它将起作用,或者在消息前加上后端套接字的路由 ID。
在初始化我的路由器应用程序时,我调用了以下代码。它绑定良好,接收消息正常但拒绝为 On_ReceiveXXX 方法工作,除非它是直接响应。我想知道为什么
public void Initialize(string frontEndAddress, string backEndAddress)
{
_poller = new Poller();
_timeAllowedBetweenPings = TimeSpan.FromMinutes(1);
_lastPingResponse = DateTime.Now;
using (var ctx = NetMQContext.Create())
{
_frontEnd = ctx.CreateRouterSocket();
_backEnd = ctx.CreateRouterSocket();
_frontEnd.Bind(frontEndAddress);
Console.WriteLine(string.Format("[Router]: Connected to {0}", frontEndAddress));
_backEnd.Bind(backEndAddress);
Console.WriteLine(string.Format("[Router]: Connected to {0}", backEndAddress));
_frontEnd.ReceiveReady += On_ReceiveFrontEnd;
_backEnd.ReceiveReady += On_ReceiveBackEnd;
_poller.AddSocket(_frontEnd);
_poller.AddSocket(_backEnd);
var timer = new NetMQTimer(TimeSpan.FromSeconds(1));
timer.Elapsed += On_Ping;
_poller.AddTimer(timer);
_poller.PollTillCancelled();
}
}
调用经销商 ReceiveReady 事件失败:
private void On_ReceiveFrontEnd(对象发送者,NetMQSocketEventArgs e) { _lastPingResponse = DateTime.Now; var frontEndMsg = e.Socket.ReceiveMultipartBytes(); var streamData = frontEndMsg.Last(); ApplicationMessage msg = PackageHelper.DeserializeOutgoing(streamData); Console.WriteLine(string.Format("Command received: {0}", msg.CO));
_backEnd.SendMultipartBytes(frontEndMsg);
}
但是如果我换行
_backEnd.SendMultipartBytes(frontEndMsg);
至
_frontEnd.SendMultipartBytes(frontEndMsg);
它突然起作用了...所以来自我的前端应用程序的消息只能得到响应,而不能传递到后端应用程序。反之亦然,对于后端消息。
使用路由器时,第一帧是路由 ID,它特定于套接字。所以你不能将整个消息从一个路由器传递到另一个路由器。将后端更改为经销商,它将起作用,或者在消息前加上后端套接字的路由 ID。