/// <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); } }