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;
            }
            }
        }
Exemple #8
0
 public void Send(int connection, SendWrapper wrapper)
 {
     wrapper.message.timeStamp = NetworkTransport.GetNetworkTimestamp();
     _connections[connection].QueueMessage(wrapper.channel, _formatter.Serialize(wrapper.message));
     return;
 }