コード例 #1
0
ファイル: Server.cs プロジェクト: nacosta-cl/ucprogra-tareas
        /// <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");
            }
        }
コード例 #2
0
ファイル: Server.cs プロジェクト: nacosta-cl/ucprogra-tareas
        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
        }
コード例 #3
0
ファイル: Server.cs プロジェクト: nacosta-cl/ucprogra-tareas
 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
         {
         }
     }
 }
コード例 #4
0
ファイル: Server.cs プロジェクト: nacosta-cl/ucprogra-tareas
 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');
                     }
                 }
             }
         }
     }
 }