示例#1
0
    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);
    }
示例#2
0
        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);
            }
        }
示例#4
0
        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.
                    }
        }
示例#5
0
        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();
        }