Esempio n. 1
0
        /// <summary>
        /// Actualizar lógica del server
        /// </summary>
        private void updateServer()
        {
            //Iterar sobre todos los nuevos clientes que se conectaron
            for (int i = 0; i < networkingMod.NewClientsCount; i++)
            {
                //Al llamar a nextNewClient() consumimos el aviso de conexion de un nuevo cliente
                TgcSocketClientInfo clientInfo = networkingMod.nextNewClient();
                atenderNuevoCliente(clientInfo);
            }

            //Iterar sobre todos los nuevos clientes que se desconectaron
            for (int i = 0; i < networkingMod.DisconnectedClientsCount; i++)
            {
                //Al llamar a nextNewClient() consumimos el aviso de desconexión de un nuevo cliente
                TgcSocketClientInfo clientInfo = networkingMod.nextDisconnectedClient();
                atenderClienteDesconectado(clientInfo);
            }

            //Atender mensajes recibidos
            for (int i = 0; i < networkingMod.Server.ReceivedMessagesCount; i++)
            {
                //El primer mensaje es el header de nuestro protocolo del ejemplo
                TgcSocketClientRecvMesg clientMsg = networkingMod.Server.nextReceivedMessage();
                TgcSocketRecvMsg        msg       = clientMsg.Msg;
                MyClientProtocol        msgType   = (MyClientProtocol)msg.readNext();

                switch (msgType)
                {
                case MyClientProtocol.PosicionActualizada:
                    serverAtenderPosicionActualizada(clientMsg);
                    break;
                }
            }
        }
        private void atenderClienteDesconectado(TgcSocketClientInfo clientInfo)
        {
            //Enviar info de desconexion a todos los clientes
            var msg = new TgcSocketSendMsg();

            msg.write(MyServerProtocol.OtroClienteDesconectado);
            msg.write(clientInfo.PlayerId);
            networkingMod.Server.sendToClient(clientInfo.PlayerId, msg);

            //Extender para permitir que se conecten nuevos ususarios
        }
        /// <summary>
        ///     Aceptar cliente y mandarle informacion inicial
        /// </summary>
        private void atenderNuevoCliente(TgcSocketClientInfo clientInfo)
        {
            //Si el cupo está lleno, desconectar cliente
            if (networkingMod.Server.Clients.Count > vehiculosData.Length)
            {
                networkingMod.Server.disconnectClient(clientInfo.PlayerId);
            }
            //Darla la información inicial al cliente
            else
            {
                var currentClientIndex = networkingMod.Server.Clients.Count - 1;
                var data = vehiculosData[currentClientIndex];
                data.playerID = clientInfo.PlayerId;

                //Enviar información al cliente
                //Primero indicamos que mensaje del protocolo es
                var msg = new TgcSocketSendMsg();
                msg.write(MyServerProtocol.InformacionInicial);
                msg.write(data);
                //También le enviamos la información de los demás clientes hasta el momento
                //Cantidad de clientes que hay
                msg.write(networkingMod.Server.Clients.Count - 1);
                //Data de todos los clientes anteriores, salvo el ultimo que es el nuevo agregado recien
                for (var i = 0; i < networkingMod.Server.Clients.Count - 1; i++)
                {
                    msg.write(vehiculosData[i]);
                }

                networkingMod.Server.sendToClient(clientInfo.PlayerId, msg);

                //Avisar a todos los demás clientes conectados (excepto este) que hay uno nuevo
                var msg2 = new TgcSocketSendMsg();
                msg2.write(MyServerProtocol.OtroClienteConectado);
                msg2.write(data);
                networkingMod.Server.sendToAllExceptOne(clientInfo.PlayerId, msg2);
            }
        }