/// <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; } } }
/// <summary> /// Avisar a todos los demás clientes sobre la nueva posicion de este cliente /// </summary> private void serverAtenderPosicionActualizada(TgcSocketClientRecvMesg clientMsg) { //Nueva posicion del cliente var newPos = (Matrix)clientMsg.Msg.readNext(); //Enviar a todos menos al cliente que nos acaba de informar var sendMsg = new TgcSocketSendMsg(); sendMsg.write(MyServerProtocol.ActualizarUbicaciones); sendMsg.write(clientMsg.PlayerId); sendMsg.write(newPos); networkingMod.Server.sendToAllExceptOne(clientMsg.PlayerId, sendMsg); }
public override void render(float elapsedTime) { Device d3dDevice = GuiController.Instance.D3dDevice; //Actualizar siempre primero todos los valores de red. //Esto hace que el cliente y el servidor reciban todos los mensajes y actualicen su es networkingMod.updateNetwork(); //Si el server está online, analizar sus mensajes if (networkingMod.Server.Online) { //Analizar los mensajes recibidos for (int i = 0; i < networkingMod.Server.ReceivedMessagesCount; i++) { //Leer el siguiente mensaje, cada vez que llamamos a nextReceivedMessage() consumimos un mensaje pendiente. TgcSocketClientRecvMesg msg = networkingMod.Server.nextReceivedMessage(); //Obtenter el primer elemento del mensaje, un string en este caso string strMsg = (string)msg.Msg.readNext(); //Mostrar mensaje recibido en consola GuiController.Instance.Logger.log(strMsg, Color.Green); } } //Si el cliente está online, analizar sus mensajes if (networkingMod.Client.Online) { //Mandamos un mensaje al server cada 1 segundo acumulatedTime += elapsedTime; if (acumulatedTime > 1) { acumulatedTime = 0; //Crear nuevo mensaje a enviar TgcSocketSendMsg msg = new TgcSocketSendMsg(); //Agregar un dato al mensaje, un string en este caso msg.write("Hello world - ElapsedTime: " + elapsedTime); //Enviar mensaje al server networkingMod.Client.send(msg); } } }