Ejemplo n.º 1
0
        static void Main(string[] args)
        {
            XmlDocument datosServer = new XmlDocument();

            //La ruta del documento XML permite rutas relativas
            //respecto del ejecutable!

            datosServer.Load("../../DataServer.xml");

            XmlNodeList user   = datosServer.GetElementsByTagName("servidor");
            string      ip     = "";
            int         puerto = 0;

            foreach (XmlElement nodo in user)
            {
                XmlNodeList nIP =
                    nodo.GetElementsByTagName("ip");

                XmlNodeList nPuerto =
                    nodo.GetElementsByTagName("puerto");

                ip     = nIP[0].InnerText;
                puerto = Int32.Parse(nPuerto[0].InnerText);
            }
            SistemaServidor.PublicarServicio();
            ConexionServidor.AceptarConexiones(ip, puerto);
        }
Ejemplo n.º 2
0
        static void HandleClient(Socket client)
        {
            bool reciboNombre = true;
            bool connected    = true;

            while (connected)
            {
                try
                {
                    int    i;
                    byte[] data          = new byte[9999];
                    byte[] loginResponse = new byte[1];
                    i = client.Receive(data);
                    if (reciboNombre)
                    {
                        byte[] respuestaLogin  = SistemaServidor.IniciarSesion(data);
                        string respuestaString = Encoding.UTF8.GetString(SistemaServidor.getDatos(respuestaLogin)).TrimEnd().Replace("\0", string.Empty);
                        bool   usuarioValido   = Boolean.Parse(respuestaString.Split('#')[1]);
                        string nombreUsuario   = respuestaString.Split('#')[0];
                        if (usuarioValido)
                        {
                            ObjetoConexion con = new ObjetoConexion(client, nombreUsuario);
                            AgregarCliente(con);
                            reciboNombre = false;
                            client.Send(respuestaLogin);
                            Console.WriteLine("Conectado al cliente " + nombreUsuario);
                        }
                        else
                        {
                            client.Send(respuestaLogin);
                            Console.WriteLine("Cliente " + nombreUsuario + " inválido.");
                        }
                    }
                    else
                    {
                        string comando           = SistemaServidor.getComando(data);
                        byte[] datos             = SistemaServidor.getDatos(data);
                        byte[] respuestaServidor = new byte[9999];
                        if (comando == "2")
                        {
                            respuestaServidor = SistemaServidor.ListarArchivos();
                            client.Send(respuestaServidor);
                        }
                        if (comando == "3")
                        {
                            respuestaServidor = SistemaServidor.SubirArchivo(Encoding.UTF8.GetString(datos).TrimEnd());
                            int    cantPaquetes        = Int16.Parse(Encoding.UTF8.GetString(datos).TrimEnd().Replace("\0", string.Empty).Split('#')[1]);
                            string nombreArchivoASubir = Encoding.UTF8.GetString(datos).TrimEnd().Replace("\0", string.Empty).Split('#')[0];
                            client.Send(respuestaServidor);
                            int        paqueteActual = 1;
                            int        offset        = 0;
                            FileStream fileStream    = new FileStream(directorioServidor + "\\" + nombreArchivoASubir, FileMode.Create, FileAccess.Write);
                            while (paqueteActual <= cantPaquetes)
                            {
                                i = client.Receive(data);
                                Console.WriteLine("Recibiendo " + nombreArchivoASubir + ". Paquete " + paqueteActual + " de " + cantPaquetes);
                                int    largoPaquete   = SistemaServidor.darLargo(data) - 9;
                                byte[] PaqueteArchivo = SistemaServidor.getDatos(data);
                                if (paqueteActual == cantPaquetes)
                                {
                                    PaqueteArchivo = PaqueteArchivo.Take(largoPaquete).ToArray();
                                }
                                SistemaServidor.GuardarPaqueteDeArchivo(fileStream, PaqueteArchivo, nombreArchivoASubir);
                                paqueteActual++;
                                respuestaServidor = SistemaServidor.SubirPaqueteDeArchivo(data);
                                client.Send(respuestaServidor);
                            }
                            fileStream.Close();
                        }

                        if (comando == "4")
                        {
                            respuestaServidor = SistemaServidor.DescargarArchivo(datos);
                            client.Send(respuestaServidor);
                            Protocolo.Protocolo protocoloRespuesta = Protocolo.Protocolo.BytesAProtocolo(respuestaServidor);
                            byte[] bytesRespuesta      = protocoloRespuesta.darBytes();
                            string stringRespuesta     = Encoding.UTF8.GetString(bytesRespuesta);
                            int    cantPaquetesAMandar = Int16.Parse(stringRespuesta.Split('#')[1]);
                            string nombreArchivo       = Encoding.UTF8.GetString(bytesRespuesta).Split('#')[0];
                            if (cantPaquetesAMandar == 0)
                            { //No se encontro el archivo
                                Console.WriteLine("Error. No se encontro el archivo " + nombreArchivo + " en el directorio del cliente");
                            }
                            else
                            {
                                string     rutaArchivo   = directorioServidor + "\\" + nombreArchivo;
                                FileStream fs            = new FileStream(rutaArchivo, FileMode.Open);
                                int        paqueteActual = 1;
                                while (paqueteActual <= cantPaquetesAMandar)
                                {
                                    byte[] req = new byte[256];
                                    i = client.Receive(req);
                                    int bytesPorDefecto = 9990;
                                    if (paqueteActual == cantPaquetesAMandar)
                                    {
                                        var largo = fs.Length;
                                        bytesPorDefecto = (int)largo - (9990 * (paqueteActual - 1));
                                    }
                                    byte[] dataParaEnviar = new byte[bytesPorDefecto];
                                    int    iDataRead      = fs.Read(dataParaEnviar, 0, bytesPorDefecto);
                                    byte[] dataProtocolo  = SistemaServidor.DescargarPaqueteDeArchivo(dataParaEnviar);
                                    client.Send(dataProtocolo);
                                    Console.WriteLine("Descargando " + nombreArchivo + ". Paquete " + paqueteActual + " de " + cantPaquetesAMandar);
                                    paqueteActual++;
                                }
                                fs.Close();
                            }
                        }
                        if (comando == "5")
                        {
                            string[]   datosServidor  = Encoding.UTF8.GetString(datos).TrimEnd().Replace("\0", string.Empty).Split('#');
                            string     ipServidor     = datosServidor[0];
                            string     puertoServidor = datosServidor[1];
                            IPEndPoint clientEndPoint = new IPEndPoint(IPAddress.Parse(Ip), Puerto + 2);
                            IPEndPoint serverEndPoint = new IPEndPoint(IPAddress.Parse(ipServidor), Int32.Parse(puertoServidor));
                            Socket     socketSinc     = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
                            socketSinc.Bind(clientEndPoint);
                            try
                            {
                                socketSinc.Connect(serverEndPoint);
                                bool   loggedIn = false;
                                byte[] dataLog  = SistemaCliente.ProcesarPedido("1", "servidor");
                                socketSinc.Send(dataLog);
                                byte[] loginRes = new byte[256];
                                int    response = socketSinc.Receive(loginRes);
                                loggedIn = Boolean.Parse(SistemaCliente.ProcesarRespuesta(loginRes).Split('#')[1]);
                                if (!loggedIn)
                                {
                                    Console.WriteLine("Nombre de cliente inválido!");
                                }
                                else
                                {
                                    byte[] serverRequest = SistemaCliente.ProcesarPedido("2");
                                    socketSinc.Send(serverRequest);
                                    byte[] serverResponse = new byte[256];
                                    int    k = socketSinc.Receive(serverResponse);
                                    string listaArchivos2 = SistemaCliente.ProcesarRespuesta(serverResponse);

                                    /*listaArchivos2 = listaArchivos2.Replace("#", "\n");
                                     * Console.WriteLine("Lista de archivos");
                                     * Console.WriteLine(listaArchivos2);*/
                                    string[] archivosServidor2 = listaArchivos2.TrimEnd().Replace("\0", string.Empty).Split('#');
                                    byte[]   listaArchivosByte = SistemaServidor.ListarArchivos();
                                    string   listaArchivos1    = SistemaCliente.ProcesarRespuesta(listaArchivosByte);
                                    string[] archivosServidor1 = listaArchivos1.Split('#');
                                    string[] archivosFaltan    = new string[archivosServidor2.Length];
                                    int      h = 0;
                                    foreach (string archivo in archivosServidor2)
                                    {
                                        if (!archivosServidor1.Contains(archivo))
                                        {
                                            archivosFaltan[h] = archivo;
                                            h++;
                                        }
                                    }
                                    foreach (string archivo in archivosFaltan)
                                    {
                                        if (archivo != null)
                                        {
                                            string nombreArchivo = archivo.Substring(37);
                                            byte[] dataRequest   = SistemaCliente.ProcesarPedido("4", nombreArchivo);
                                            socketSinc.Send(dataRequest);
                                            byte[] dataResponse = new byte[9999];
                                            int    z            = socketSinc.Receive(dataResponse);
                                            dataResponse = dataResponse.Take(z).ToArray();
                                            int cantPaquetes  = Int16.Parse(SistemaCliente.ProcesarRespuesta(dataResponse).Split('#')[1]);
                                            int paqueteActual = 1;
                                            if (cantPaquetes == 0)
                                            {
                                                Console.WriteLine("No es posible descargar el archivo indicado.");
                                            }
                                            else
                                            {
                                                FileStream fileStream = new FileStream(directorioServidor + "\\" + nombreArchivo, FileMode.Create, FileAccess.Write);
                                                while (paqueteActual <= cantPaquetes)
                                                {
                                                    byte[] requestPaquete = SistemaCliente.ProcesarPedido("8", paqueteActual.ToString());
                                                    socketSinc.Send(requestPaquete);
                                                    byte[] responsePaquete = new byte[9999];
                                                    int    j = socketSinc.Receive(responsePaquete);
                                                    Console.WriteLine("Recibiendo " + nombreArchivo + ". Paquete " + paqueteActual + " de " + cantPaquetes);
                                                    int    largoPaquete   = SistemaCliente.darLargo(responsePaquete) - 9;
                                                    byte[] PaqueteArchivo = SistemaCliente.getDatos(responsePaquete);
                                                    if (paqueteActual == cantPaquetes)
                                                    {
                                                        PaqueteArchivo = PaqueteArchivo.Take(largoPaquete).ToArray();
                                                    }
                                                    SistemaCliente.GuardarPaqueteDeArchivo(fileStream, PaqueteArchivo, nombreArchivo);
                                                    paqueteActual++;
                                                }
                                                fileStream.Close();
                                            }
                                        }
                                    }

                                    byte[] respuestaSinc = SistemaServidor.NotificarSincronizacion();
                                    client.Send(respuestaSinc);
                                }
                            }

                            catch (SocketException ex)
                            {
                                socketSinc.Shutdown(SocketShutdown.Both);
                                socketSinc.Close();
                                Console.WriteLine("El servidor cerró la conexión");
                                Console.ReadLine();
                            }
                            //respuestaServidor = SistemaServidor.SincronizarServidor(Encoding.UTF8.GetString(datos).TrimEnd().Replace("\0", string.Empty));
                        }
                        if (comando == "6")
                        {
                            DesconectarCliente(client);
                            connected = false;
                        }

                        /*if (comando == "8")
                         * {
                         *  respuestaServidor = SistemaServidor.DescargarPaqueteDeArchivo(datos);
                         * }
                         * if (comando == "7")
                         * {
                         *  respuestaServidor = SistemaServidor.SubirPaqueteDeArchivo(datos);
                         * }*/
                        //byte[] respuestaServidor = SistemaServidor.ProcesarPedido(data);
                        //aca separo segun el comando que haya llegado
                        //client.Send(respuestaServidor);
                        //Console.WriteLine(Encoding.UTF8.GetString(data).TrimEnd());
                    }
                }
                catch (SocketException ex)
                {
                    Console.WriteLine("El cliente cerró la conexión");
                    connected = false;
                }
            }
            client.Shutdown(SocketShutdown.Both);
            client.Close();
        }