public async Task <bool> Send(StageAddress address, byte[] data) { if (address.Address == null) { address = await LocalAddress(); } //try send on known peers var reqSocket = new NetMQ.Sockets.DealerSocket(); reqSocket.Options.Identity = Guid.NewGuid().ToByteArray(); reqSocket.Connect(address.Address); var messageToServer = new NetMQMessage(); messageToServer.AppendEmptyFrame(); messageToServer.Append(data); reqSocket.SendMultipartMessage(messageToServer); return(true); }
public void InprocRouterDealerTest() { // The main thread simply starts several clients and a server, and then // waits for the server to finish. var readyMsg = Encoding.UTF8.GetBytes("RDY"); var freeWorkers = new Queue<byte[]>(); using (var backendsRouter = new RouterSocket()) { backendsRouter.Options.Identity = Guid.NewGuid().ToByteArray(); backendsRouter.Bind("inproc://backend"); backendsRouter.ReceiveReady += (o, e) => { // Handle worker activity on backend while (e.Socket.HasIn) { var msg = e.Socket.ReceiveMultipartMessage(); var idRouter = msg.Pop(); // forget the empty frame if (msg.First.IsEmpty) msg.Pop(); var id = msg.Pop(); if (msg.First.IsEmpty) msg.Pop(); if (msg.FrameCount == 1) { // worker send RDY message queue his Identity to the free workers queue if (readyMsg[0] == msg[0].Buffer[0] && readyMsg[1] == msg[0].Buffer[1] && readyMsg[2] == msg[0].Buffer[2]) { lock (freeWorkers) { freeWorkers.Enqueue(id.Buffer); } } } } }; var poller = new NetMQPoller { backendsRouter }; for (int i = 0; i < 2; i++) { var workerThread = new Thread(state => { byte[] routerId = (byte[])state; byte[] workerId = Guid.NewGuid().ToByteArray(); using (var workerSocket = new DealerSocket()) { workerSocket.Options.Identity = workerId; workerSocket.Connect("inproc://backend"); var workerReadyMsg = new NetMQMessage(); workerReadyMsg.Append(workerId); workerReadyMsg.AppendEmptyFrame(); workerReadyMsg.Append(readyMsg); workerSocket.SendMultipartMessage(workerReadyMsg); Thread.Sleep(1000); } }); workerThread.IsBackground = true; workerThread.Name = "worker" + i; workerThread.Start(backendsRouter.Options.Identity); } poller.RunAsync(); Thread.Sleep(1000); poller.Stop(); Assert.AreEqual(2, freeWorkers.Count); } }
public void RouterDealerMessaging() { using (var server = new RouterSocket()) using (var client = new DealerSocket()) { int port = server.BindRandomPort("tcp://127.0.0.1"); client.Connect("tcp://127.0.0.1:" + port); var clientOutgoingMessage = new NetMQMessage(); clientOutgoingMessage.Append("Hello"); client.SendMultipartMessage(clientOutgoingMessage); NetMQMessage serverIncomingMessage = server.ReceiveMultipartMessage(); // number of frames should be one because first message should be identity of client Assert.AreEqual(2, serverIncomingMessage.FrameCount); Assert.AreEqual("Hello", serverIncomingMessage[1].ConvertToString()); var serverOutgoingMessage = new NetMQMessage(); // first adding the identity serverOutgoingMessage.Append(serverIncomingMessage[0]); serverOutgoingMessage.Append("World"); server.SendMultipartMessage(serverOutgoingMessage); var incomingClientMessage = client.ReceiveMultipartMessage(); Assert.AreEqual(1, incomingClientMessage.FrameCount); Assert.AreEqual("World", incomingClientMessage[0].ConvertToString()); } }