private void SendReply(object wrapper) { var reply = (ReplyWrapper)wrapper; var send = new SendWrapper { message = reply.message, channel = reply.channel, }; _socket.Send(reply.connection, send); }
private void Update() { if (_closing && _socket == null) { Destroy(gameObject); } while (_socket.PollMessage(out ReceiveWrapper wrapper)) { switch (wrapper.message.lowType) { case NetworkMessageType.Higher: { EventManager.Singleton.Publish(GameEventType.ReceiveNetworkMessage, wrapper); break; } case NetworkMessageType.Connect: { Debug.Log(string.Format("HOST::Client {0}:{1} connected", wrapper.ip, wrapper.port)); _clients.Add(wrapper.connection); var send = new SendWrapper { message = new FallbackInfo(BroadcastKey, (_clients.Count - 1) * _switchDelay), channel = 0, }; Send(wrapper.connection, send); break; } case NetworkMessageType.Disconnect: { Debug.Log(string.Format("HOST::Client {0}:{1} disconnected", wrapper.ip, wrapper.port)); var disconnectedIndex = _clients.FindIndex(match => match == wrapper.connection); _clients.Remove(wrapper.connection); if (_closing) { break; } for (var i = disconnectedIndex; i < _clients.Count; i++) { var send = new SendWrapper { message = new QueueShuffle(i * _switchDelay), channel = 0, }; Send(_clients[i], send); } break; } } } }
private static void DoSend(object o) { SendWrapper wrapper = o as SendWrapper; if (wrapper != null) { try { MessageManager.Send(wrapper.Sender, wrapper.Message); } catch (Exception ex) { System.Diagnostics.Trace.WriteLine(ex.Message); } } }
private void SendExcept(object wrapper) { var except = (ExceptWrapper)wrapper; var send = new SendWrapper { message = except.message, channel = except.channel, }; for (var i = 0; i < _clients.Count; i++) { if (_clients[i] == except.connection) { continue; } _socket.Send(_clients[i], send); } }
void SendLoop(CancellationToken ct) { var sendWrapper = new SendWrapper(); sendWrapper.Connection = this; while (true) { if (ct.IsCancellationRequested) { break; } T packet; if (sendQueue.TryDequeue(out packet)) { var sendSocketAsyncEventArgs = Server.GetSendSocketAsyncEventArgs(); sendWrapper.Packet = packet; sendSocketAsyncEventArgs.UserToken = sendWrapper; if (Packetizer.SetBuffer(sendSocketAsyncEventArgs, packet)) { if (Socket.SendAsync(sendSocketAsyncEventArgs)) { sendAutoEvent.WaitOne(Timeout.Infinite); } else { ProcessSend(sendSocketAsyncEventArgs); } } else { ProcessSend(sendSocketAsyncEventArgs); } } else { sendQueueAutoEvent.WaitOne(Timeout.Infinite); } } }
private void OnSendMultiplayerMessage(object info) { var message = info as AMultiplayerMessage; if (_hosting) { /* * Поведение хоста при отправке сообщения */ switch (message.highType) { // само-логин case MultiplayerMessageType.LogIn: { _actualPlayer.LoggedIn(RegisterPlayer(message as LogIn)); var send = new SendWrapper { message = message, channel = 0, }; EventManager.Singleton.Publish(GameEventType.SendNetworkMessage, send); break; } case MultiplayerMessageType.SessionStarted: { EventManager.Singleton.Publish(GameEventType.SessionStarted, null); var send = new SendWrapper { message = message, channel = 0, }; EventManager.Singleton.Publish(GameEventType.SendNetworkMessage, send); break; } // само-движение case MultiplayerMessageType.Move: { _multiplayerScene.Move(message as Move); break; } case MultiplayerMessageType.TransformSync: { var send = new SendWrapper { message = message, channel = 2, }; EventManager.Singleton.Publish(GameEventType.SendNetworkMessage, send); break; } case MultiplayerMessageType.LogOut: { var send = new SendWrapper { message = new SessionEnded(), channel = 0, }; EventManager.Singleton.Publish(GameEventType.SendNetworkMessage, send); EventManager.Singleton.Publish(GameEventType.LoggedOut, null); break; } default: { break; } } return; } /* * Поведение клиента при отправке сообщения */ switch (message.highType) { case MultiplayerMessageType.TransformSync: { break; } default: { var send = new SendWrapper { message = message, channel = 1, }; EventManager.Singleton.Publish(GameEventType.SendNetworkMessage, send); break; } } }
private void OnReceiveNetworkMessage(object info) { var wrapper = (ReceiveWrapper)info; var message = wrapper.message as AMultiplayerMessage; if (_hosting) { /* * Поведение хоста при приеме сообщения */ switch (message.highType) { case MultiplayerMessageType.LogIn: { var except = new ExceptWrapper { message = wrapper.message, channel = 0, }; EventManager.Singleton.Publish(GameEventType.SendNetworkExceptMessage, except); var reply = new ReplyWrapper { message = RegisterPlayer(message as LogIn), connection = wrapper.connection, channel = 0, }; EventManager.Singleton.Publish(GameEventType.SendNetworkReplyMessage, reply); foreach (var value in _playerModels.Values) { var player = new ReplyWrapper { message = new LogIn(value.playerName), connection = wrapper.connection, channel = 0, }; EventManager.Singleton.Publish(GameEventType.SendNetworkReplyMessage, player); } break; } case MultiplayerMessageType.Move: { _multiplayerScene.Move(message as Move); break; } case MultiplayerMessageType.LogOut: { var send = new SendWrapper { message = wrapper.message, channel = 0, }; EventManager.Singleton.Publish(GameEventType.SendNetworkMessage, send); var reply = new ReplyWrapper { message = UnregisterPlayer(message as LogOut), connection = wrapper.connection, channel = 0, }; EventManager.Singleton.Publish(GameEventType.SendNetworkReplyMessage, reply); break; } } return; } /* * Поведение клиента при приеме сообщения */ switch (message.highType) { case MultiplayerMessageType.LogIn: { if (_actualPlayer.Logged) { RegisterPlayer(message as LogIn); } break; } case MultiplayerMessageType.LoggedIn: { _actualPlayer.LoggedIn(message as LoggedIn); break; } case MultiplayerMessageType.SessionStarted: { EventManager.Singleton.Publish(GameEventType.SessionStarted, null); break; } case MultiplayerMessageType.TransformSync: { _multiplayerScene.UpdateRigidbody(message as TransformSync, wrapper.ping); break; } case MultiplayerMessageType.LogOut: { UnregisterPlayer(message as LogOut); break; } case MultiplayerMessageType.SessionEnded: { _actualPlayer.LoggedOut(); break; } case MultiplayerMessageType.LoggedOut: { _actualPlayer.LoggedOut(); break; } } }
public void Send(int connection, SendWrapper wrapper) { wrapper.message.timeStamp = NetworkTransport.GetNetworkTimestamp(); _connections[connection].QueueMessage(wrapper.channel, _formatter.Serialize(wrapper.message)); return; }