/// <summary> /// Sincroniza un cliente atrasado, enviandole el histórico de mensajes /// </summary> /// <param name="clienteAtrasado"></param> private void syncCli(clienteSV clienteAtrasado) { NetworkStream stream = clienteAtrasado.ClienteTCP.GetStream(); alerta("[i] Iniciando sincronizacion con cliente : " + clienteAtrasado.nombre + '\n'); try { if (HistoricoMensajes.Count != 0) { foreach (PaqueteEdit item in HistoricoMensajes) { formatbin.Serialize(stream, item); } } } catch { alerta("[i] Error en el proceso de sincronizacion del cliente. Sincronizacion abortada : " + clienteAtrasado.nombre + '\n'); clienteAtrasado.conectado = false; eliminarCliente(clienteAtrasado); } if (verbose) { alerta("[vv]Sincronizacion completada"); } }
private void escucharCliente(object cli) { clienteSV cliente = cli as clienteSV; NetworkStream stream = cliente.ClienteTCP.GetStream(); bool vivo = true; try { if (cliente.nuevo) { alerta("[i] Sincronizando cliente nuevo " + cliente.nombre + '\n'); syncCli(cliente); } } catch { vivo = false; } alerta("[i] Cliente de nombre " + cliente.nombre + " iniciado" + '\n'); while (vivo) { try { if (stream.DataAvailable) { object msg = formatbin.Deserialize(stream); PaqueteEdit pack = msg as PaqueteEdit; if (!(pack.Tipo == tipoMensaje.Ping)) { mensajeRecibido(pack); } } if (!cliente.ClienteTCP.Connected) { vivo = false; } } catch { vivo = false; } } eliminarCliente(cliente); //Eliminar al cliente }
private void eliminarCliente(clienteSV MFDcli) { if (Clientes != null) { try { lock (Clientes) { MFDcli.desconectar(); Clientes.Remove(MFDcli); alerta("[i] Cliente desconectado : " + MFDcli.nombre + '\n'); MFDcli.conectado = false; MFDcli.ClienteTCP = null; } } catch { } } }
private void RecibirConexiones() { alerta("[i] Servidor iniciado" + '\n'); alerta("[i] Puerto de conexion abierto" + '\n'); while (true) { if (Clientes.Count != maxConn && listenerServer.Pending()) { alerta("[i] Intento de conexion recibido" + '\n'); clienteSV clienteEspera = null; bool identificado = false; bool error = false; bool nuevocli = true; while (!identificado && !error) { try { TcpClient TCPcli = listenerServer.AcceptTcpClient(); NetworkStream stream = TCPcli.GetStream(); alerta("[i] Esperando handshake" + '\n'); while (!identificado) { if (stream.DataAvailable) { object msg = formatbin.Deserialize(stream); if (verbose) { alerta("[vv] Desserializacion completada" + '\n'); } string login = msg as string; //string id~nombre if (verbose) { alerta("[vv] Parsing completado" + '\n'); } string id = login.Split('&')[0]; string nombre = login.Split('&')[1]; alerta("[i] Recibido handshake: ID = " + id + " Nombre = " + nombre + '\n'); foreach (clienteSV clitmp in HistoricoClientes) { if (!clitmp.conectado && (clitmp.ID == id || clitmp.nombre == nombre)) { alerta("[i] Cliente antiguo detectado" + '\n'); clienteEspera = clitmp; clitmp.conectado = true; clitmp.ClienteTCP = TCPcli; nuevocli = false; } } if (nuevocli) { alerta("[i] Cliente nuevo detectado" + '\n'); clienteEspera = new clienteSV(id, nombre, true, TCPcli); } if (verbose) { alerta("[vv] Identificacion finalizada" + '\n'); } identificado = true; } } } catch { alerta("[!] Error 0001 - Error en la conexion" + '\n'); error = true; } } if (identificado) { lock (Clientes) { if (nuevocli) { HistoricoClientes.Add(clienteEspera); } Clientes.Add(clienteEspera); alerta("[i] Cliente con nombre " + '"' + clienteEspera.nombre + '"' + " y ID = " + clienteEspera.ID + " está conectado" + '\n'); Thread th = new Thread(escucharCliente); th.IsBackground = true; th.Start(clienteEspera); if (verbose) { alerta("[vv] Hilo de cliente iniciado" + '\n'); } } } } } }