public bool sendAndReceive(ref NetMQMessage req_msg, ref NetMQ.Msg resp_msg) { if (socket == null) { reconnect(); } bool ok = false; NetMQMessage copy = new NetMQMessage(req_msg); socket.SendMultipartMessage(copy); // receive if (socket.TryReceive(ref resp_msg, timeout)) { ok = true; //UnityEngine.Debug.Log("ReliableExternalClient: response received " // + new StdMessage(resp_msg.Data[1], resp_msg.Data[2]).to_string()); } copy.Clear(); socket.Dispose(); socket.Close(); socket = null; if (socket == null) { UnityEngine.Debug.Log("ReliableExternalClient: socket closed and null"); } return(ok); }
public static void StartServer(IDistributedApp app, string url, int expectedClients = 0, Action <Exception> connected = null) { Task.Run(() => { using (var context = NetMQContext.Create()) using (var input = context.CreateDealerSocket()) { Dictionary <string, DealerSocket> clients = null; try { input.Bind(url); if (expectedClients > 0) { clients = new Dictionary <string, DealerSocket>(); awaitClients(input, expectedClients, clients, context, app); app.SendToClient = (client, msg) => writeMessage(clients[client], msg); } connected(null); } catch (Exception ex) { connected(ex); return; } //loop var message = new NetMQMessage(expectedFrameCount: 7); var appMessage = new DistributedAppMessage(); for (;;) { message = input.ReceiveMultipartMessage(expectedFrameCount: 7); try { if (!readMessage(message, appMessage)) { continue; } app.Receive(appMessage); } catch { //td: log? } finally { message.Clear(); } } } }); }
public static void ReceiveMessage(this IReceivingSocket socket, NetMQMessage message, bool dontWait = false) { message.Clear(); bool more = true; while (more) { byte[] buffer = socket.Receive(dontWait, out more); message.Append(buffer); } }
private static void Main(string[] args) { var deciSecond = new TimeSpan(10000); using (var subscriber = new SubscriberSocket()) // For receiving updates from presentation host using (var publisher = new WSPublisher()) // For publishing updates from presentation host to audience using (var responder = new WSRouter()) // Handling on-demand requests for late-joining or crashing clients { subscriber.Bind("tcp://*:3000"); subscriber.SubscribeToAnyTopic(); publisher.Bind("ws://*:3001"); responder.Bind("ws://*:3002"); byte step = 0; subscriber.ReceiveReady += (_, __) => { if (!subscriber.TryReceiveFrameBytes(deciSecond, out var received)) { return; } step = received[0]; Console.Out.WriteLine("Sending " + step + " to audience."); publisher.TrySendFrame(deciSecond, new[] { step }); }; responder.ReceiveReady += (_, __) => { NetMQMessage msg = null; if (!responder.TryReceiveMultipartMessage(deciSecond, ref msg)) { return; } var identity = msg.Pop().Buffer; var request = msg.Pop().ConvertToString(); msg.Clear(); if (request == "Which slide are we on?") { responder.TrySendMultipartBytes(deciSecond, identity, new[] { step }); } else { if (!responder.TrySendFrame(deciSecond, identity, true)) { return; } responder.TrySendFrameEmpty(deciSecond); } }; new NetMQPoller { subscriber, responder }.Run(); // Polling both subscriber and router sockets. } }
public static void ReceiveMessage( this IReceivingSocket socket, NetMQMessage message, bool dontWait = false) { message.Clear(); var msg = new Msg(); msg.InitEmpty(); do { socket.Receive(ref msg, dontWait ? SendReceiveOptions.DontWait : SendReceiveOptions.None); message.Append(msg.CloneData()); } while (msg.HasMore); msg.Close(); }