public void RequestResponseMultipartMessageWithRetryFails() { const string address = "tcp://127.0.0.1:50002"; const string pubAddress = "tcp://127.0.0.1:60002"; const int numTries = 5; var requestTimeout = TimeSpan.FromMilliseconds(100); var requestMessage = new NetMQMessage(1); requestMessage.Append("Hi"); using (var progressPublisher = new PublisherSocket(pubAddress)) using (var progressSubscriber = new SubscriberSocket(pubAddress)) using (var server = new RouterSocket(address)) { progressSubscriber.SubscribeToAnyTopic(); var progressProactor = new NetMQProactor(progressSubscriber, (socket, message) => Console.WriteLine("C: {0} {1:ss.fff}", message[0].ConvertToString(), DateTime.Now)); var serverProactor = new NetMQProactor(server, (socket, message) => { Console.WriteLine("ResponseEcho recieved message {0} at {1:ss.fff}", message[2].ConvertToString(), DateTime.Now); }); using (serverProactor) using (progressProactor) { var responseMessage = RequestSocket.RequestResponseMultipartMessageWithRetry(address, requestMessage, numTries, requestTimeout, progressPublisher); Assert.IsNull(responseMessage); } } }
private void Serve() { log.Info("Session server is starting."); responseSocket = new ResponseSocket(); switch (sessionType) { case eSessionType.Local: responseSocket.Bind("inproc://opendiablo2-session"); break; case eSessionType.Server: case eSessionType.Remote: default: throw new OpenDiablo2Exception("This session type is currently unsupported."); } OnJoinGame += OnJoinGameHandler; OnMoveRequest += OnMovementRequestHandler; OnUpdateEquipment += OnUpdateEquipmentHandler; var proactor = new NetMQProactor(responseSocket, (socket, message) => { foreach (var msg in message) { using (var ms = new MemoryStream(msg.ToByteArray())) using (var br = new BinaryReader(ms)) { var messageFrame = getMessageFrame((eMessageFrameType)br.ReadByte()); messageFrame.LoadFrom(br); messageFrame.Process(socket.GetHashCode(), this); } } }); running = true; WaitServerStartEvent.Set(); Task.Run(() => { var lastRun = DateTime.Now; while (running) { var newTime = DateTime.Now; var timeDiff = (newTime - lastRun).TotalMilliseconds; lastRun = newTime; gameServer.Update((int)timeDiff); if (timeDiff < serverUpdateRate) { Thread.Sleep((int)Math.Min(serverUpdateRate, Math.Max(0, serverUpdateRate - timeDiff))); } } }); resetEvent.WaitOne(); proactor.Dispose(); running = false; responseSocket.Dispose(); log.Info("Session server has stopped."); }
private void Serve() { log.Info("Session server is starting."); responseSocket = new ResponseSocket(); switch (sessionType) { case eSessionType.Local: responseSocket.Bind("inproc://opendiablo2-session"); break; case eSessionType.Server: case eSessionType.Remote: default: throw new OpenDiablo2Exception("This session type is currently unsupported."); } OnJoinGame += OnJoinGameHandler; OnMoveRequest += OnMovementRequestHandler; var proactor = new NetMQProactor(responseSocket, (socket, message) => { var bytes = message.First().ToByteArray(); var frameType = (eMessageFrameType)bytes[0]; var frameData = bytes.Skip(1).ToArray(); // TODO: Can we maybe use pointers? This seems wasteful var messageFrame = getMessageFrame(frameType); messageFrame.Data = frameData; messageFrame.Process(socket.GetHashCode(), this); }); running = true; WaitServerStartEvent.Set(); Task.Run(() => { var lastRun = DateTime.Now; while (running) { var newTime = DateTime.Now; var timeDiff = (newTime - lastRun).TotalMilliseconds; lastRun = newTime; gameServer.Update((int)timeDiff); if (timeDiff < serverUpdateRate) { Thread.Sleep((int)Math.Min(serverUpdateRate, Math.Max(0, serverUpdateRate - timeDiff))); } } }); resetEvent.WaitOne(); proactor.Dispose(); running = false; responseSocket.Dispose(); log.Info("Session server has stopped."); }
/// <summary> /// Initializes the base socket. /// </summary> /// <param name="socket">The underlying ZeroMQ socket.</param> /// <param name="heartbeatInterval">Heartbeat interval.</param> protected SocketBase(NetMQSocket socket, TimeSpan heartbeatInterval) { HeartbeatInterval = heartbeatInterval; Channels = new Dictionary <object, Channel>(); Closed = false; Socket = socket; TimerPoller = new TimerPoller(); Proactor = new NetMQProactor(socket, ReceiveMessage); TimerPoller.Start(); }
public void RequestResponseMultipartMessageWithRetrySucceedsNotOnFirstTry() { const string address = "tcp://127.0.0.1:50001"; const string pubAddress = "tcp://127.0.0.1:60001"; const int numTries = 5; var requestTimeout = TimeSpan.FromMilliseconds(100); var requestMessage = new NetMQMessage(1); requestMessage.Append("Hi"); using (var progressPublisher = new PublisherSocket(pubAddress)) using (var progressSubscriber = new SubscriberSocket(pubAddress)) using (var server = new RouterSocket(address)) { progressSubscriber.SubscribeToAnyTopic(); var progressProactor = new NetMQProactor(progressSubscriber, (socket, message) => Console.WriteLine("C: {0} {1:ss.fff}", message[0].ConvertToString(), DateTime.Now)); int attempt = 0; var serverProactor = new NetMQProactor(server, (socket, message) => { Console.WriteLine("ResponseEcho recieved message {0} at {1:ss.fff}", message[2].ConvertToString(), DateTime.Now); attempt++; if (attempt > 1) { // reply same message socket.SendMultipartMessage(message); } }); using (serverProactor) using (progressProactor) { var responseMessage = RequestSocket.RequestResponseMultipartMessageWithRetry(address, requestMessage, numTries, requestTimeout, progressPublisher); Assert.IsNotNull(responseMessage); Assert.AreEqual(1, responseMessage.FrameCount); var responseString = responseMessage.First.ConvertToString(); Assert.AreEqual("Hi", responseString); } } }
public void RequestResponseMultipartMessageWithRetrySucceedsFirstTry() { const string address = "tcp://127.0.0.1:50001"; const string pubAddress = "tcp://127.0.0.1:60001"; const int numTries = 5; var requestTimeout = TimeSpan.FromMilliseconds(100); var requestMessage = new NetMQMessage(1); requestMessage.Append("Hi"); using (var progressPublisher = new PublisherSocket(pubAddress)) using (var progressSubscriber = new SubscriberSocket(pubAddress)) using (var server = new ResponseSocket(address)) { progressSubscriber.SubscribeToAnyTopic(); var progressProactor = new NetMQProactor(progressSubscriber, (socket, message) => Console.WriteLine("C: {0} {1:ss.fff}", message[0].ConvertToString(), DateTime.Now)); var serverProactor = new NetMQProactor(server, (socket, message) => { Console.WriteLine("ResponseEcho received message {0} at {1:ss.fff}", message.First.ConvertToString(), DateTime.Now); // reply same message socket.SendMultipartMessage(message); }); using (serverProactor) using (progressProactor) { var responseMessage = RequestSocket.RequestResponseMultipartMessageWithRetry(address, requestMessage, numTries, requestTimeout, progressPublisher); Assert.IsNotNull(responseMessage); Assert.AreEqual(1, responseMessage.FrameCount); var responseString = responseMessage.First.ConvertToString(); Assert.AreEqual("Hi", responseString); } } }
public void RequestResponseStringWithRetrySucceedsNotOnFirstTry() { const string address = "tcp://127.0.0.1:50001"; const string pubAddress = "tcp://127.0.0.1:60001"; const int numTries = 5; var requestTimeout = TimeSpan.FromMilliseconds(100); using (var progressPublisher = new PublisherSocket(pubAddress)) using (var progressSubscriber = new SubscriberSocket(pubAddress)) using (var server = new RouterSocket(address)) { progressSubscriber.SubscribeToAnyTopic(); var progressProactor = new NetMQProactor(progressSubscriber, (socket, message) => Console.WriteLine("C: {0} {1:ss.fff}", message[0].ConvertToString(), DateTime.Now)); int attempt = 0; var serverProactor = new NetMQProactor(server, (socket, message) => { Console.WriteLine("ResponseEcho recieved message {0} at {1:ss.fff}", message[2].ConvertToString(), DateTime.Now); attempt++; if (attempt > 1) { // reply same message socket.SendMultipartMessage(message); } }); using (serverProactor) using (progressProactor) { var responseMessage = RequestSocket.RequestResponseStringWithRetry(address, "Hi", numTries, requestTimeout, progressPublisher); Assert.AreEqual("Hi", responseMessage); } } }