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> /// 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); }
/// <summary> /// Actualizar lógicad el cliente /// </summary> private void updateClient() { //Analizar los mensajes recibidos for (int i = 0; i < networkingMod.Client.ReceivedMessagesCount; i++) { //El primer mensaje es el header de nuestro protocolo del ejemplo TgcSocketRecvMsg msg = networkingMod.Client.nextReceivedMessage(); MyServerProtocol msgType = (MyServerProtocol)msg.readNext(); //Ver que tipo de mensaje es switch (msgType) { case MyServerProtocol.InformacionInicial: clienteAtenderInformacionInicial(msg); break; case MyServerProtocol.OtroClienteConectado: clienteAtenderOtroClienteConectado(msg); break; case MyServerProtocol.ActualizarUbicaciones: clienteAtenderActualizarUbicaciones(msg); break; case MyServerProtocol.OtroClienteDesconectado: clienteAtenderOtroClienteDesconectado(msg); break; } } if (meshPrincipal != null) { //Renderizar todo renderClient(); //Enviar al server mensaje con posicion actualizada, 10 paquetes por segundo acumulatedTime += GuiController.Instance.ElapsedTime; if (acumulatedTime > 0.1) { acumulatedTime = 0; //Enviar posicion al server TgcSocketSendMsg msg = new TgcSocketSendMsg(); msg.write(MyClientProtocol.PosicionActualizada); msg.write(meshPrincipal.Transform); networkingMod.Client.send(msg); } } }
/// <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); } }
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); } } }
public override void Update() { //Actualizar siempre primero todos los valores de red. //Esto hace que el cliente y el servidor reciban todos los mensajes y actualicen su es updateNetwork(); //Si el server está online, analizar sus mensajes if (Server.Online) { //Analizar los mensajes recibidos for (var i = 0; i < Server.ReceivedMessagesCount; i++) { //Leer el siguiente mensaje, cada vez que llamamos a nextReceivedMessage() consumimos un mensaje pendiente. var msg = Server.nextReceivedMessage(); //Obtenter el primer elemento del mensaje, un string en este caso text.Text += msg.Msg.readNext().ToString(); } } //Si el cliente está online, analizar sus mensajes if (Client.Online) { //Mandamos un mensaje al server cada 1 segundo acumulatedTime += ElapsedTime; if (acumulatedTime > 1) { acumulatedTime = 0; //Crear nuevo mensaje a enviar var msg = new TgcSocketSendMsg(); //Agregar un dato al mensaje, un string en este caso msg.write("Hello world - ElapsedTime: " + ElapsedTime); //Enviar mensaje al server Client.send(msg); } } }