/// <summary> /// Comprueba si hay nuevos clientes para conectar /// </summary> private void ComprobarClienteConectado(IAsyncResult ar) { if (clientes == null) { clientes = new List <ClienteTCP>(); } if (AceptarNuevasConexiones) { try { ClienteTCP nuevoCliente = new ClienteTCP(listener.EndAcceptTcpClient(ar), "Servidor"); clientes.Add(nuevoCliente); nuevoCliente.DatosRecibidos += new DelegadoComandoRecibido(DatosClienteRecibidos); //Esperar más clientes listener.BeginAcceptTcpClient(new AsyncCallback(ComprobarClienteConectado), null); //Invocar el evento InvocarEvento(ClienteConectado, ControlInvoke, nuevoCliente, null); } catch { } } }
/// <summary> /// Se llama cuando existen datos disponibles para un cliente /// </summary> private static void DatosDisponibles(object arg) { ClienteTCP cliente = (ClienteTCP)arg; if (cliente.DatosRecibidos != null) { NetworkStream stream = cliente.TcpClient.GetStream(); BinaryReader lector = new BinaryReader(stream); while (true) { try { if (cliente.TcpClient.Available > 0) { bool comprimido = lector.ReadBoolean(); ushort comando = lector.ReadUInt16(); int longitudArray = lector.ReadInt32(); byte[] datos = lector.ReadBytes((int)longitudArray); if (comprimido) { datos = LZMA.Decompress(datos); } string cadena = Encoding.UTF8.GetString(datos); string[] parametros = ObtenerSubCadenas(cadena); //Llamar al evento if (cliente.ControlInvoke != null) { foreach (Delegate delegado in cliente.DatosRecibidos.GetInvocationList()) { cliente.ControlInvoke.Invoke(delegado, new object[] { comando, parametros, cadena, cliente }); Application.DoEvents(); if (cliente.DatosRecibidos == null) { break; } } } else { cliente.DatosRecibidos(comando, parametros, cadena, cliente); Application.DoEvents(); if (cliente.DatosRecibidos == null) { break; } } } else { break; } } catch { break; } } } }
/// <summary> /// Datos de cualquier cliente recibidos /// </summary> void DatosClienteRecibidos(ushort comando, string[] parametros, string cadena, ClienteTCP cliente) { if (DatosRecibidos != null) { InvocarEvento(DatosRecibidos, this.ControlInvoke, comando, parametros, cadena, cliente); } }