Persistencia y Datos Transaccionales Proyecto Persistencia Y Datos Transaccionales

FACULTAD DE INGENIERÍA Y CIENCIAS BÁSICAS Persistencia y Datos Transaccionales PROYECTO GRUPAL PROYECTO PERSISTENCIA

Views 153 Downloads 9 File size 335KB

Report DMCA / Copyright

DOWNLOAD FILE

Recommend stories

Citation preview

FACULTAD DE INGENIERÍA Y CIENCIAS BÁSICAS

Persistencia y Datos Transaccionales

PROYECTO GRUPAL

PROYECTO PERSISTENCIA Y DATOS TRANSACCIONALES

TERCERA ENTREGA

TUTOR: Alexis Rojas Cordero

Javier José Hernández Torregroza

Código: 1411025812

Fernando Rodríguez Caro

Código: 1311070271

INSTITUCIÓN UNIVERSITARIA POLITÉCNICO GRANCOLOMBIANO 2018 - COLOMBIA

FACULTAD DE INGENIERÍA Y CIENCIAS BÁSICAS

PROYECTO GRUPAL

Persistencia y Datos Transaccionales

Contenido Modelo Entidad Relación........................................................................................3 Modelo Entidad Relación Corrección....................................................................4 Modelo Entidad Relación Definitivo......................................................................5 Script Creación Base de Datos..............................................................................6 Estado del Arte.......................................................................................................10 

Sockets...............................................................................................................................10



Arquitectura Cliente / Servidor.........................................................................................11



La Conexión.......................................................................................................................12



El Servidor..........................................................................................................................14



El Cliente.............................................................................................................................15



Diagrama de Flujo.............................................................................................................16



Ejemplo...............................................................................................................................17

Utilización de Sockets...........................................................................................19 

Clase Conectar..................................................................................................................19



Scripts.................................................................................................................................20

Referencias.............................................................................................................22

1.

FACULTAD DE INGENIERÍA Y CIENCIAS BÁSICAS

PROYECTO GRUPAL

Persistencia y Datos Transaccionales

Modelo Entidad Relación

FACULTAD DE INGENIERÍA Y CIENCIAS BÁSICAS

PROYECTO GRUPAL

Persistencia y Datos Transaccionales

Modelo Entidad Relación Corrección

FACULTAD DE INGENIERÍA Y CIENCIAS BÁSICAS

PROYECTO GRUPAL

Persistencia y Datos Transaccionales

Modelo Entidad Relación Definitivo

FACULTAD DE INGENIERÍA Y CIENCIAS BÁSICAS

PROYECTO GRUPAL

Persistencia y Datos Transaccionales

Script Creación Base de Datos SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0; SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0; SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='TRADITIONAL,ALLOW_INVALID_DATES'; -- ------------------------------------------------------ Schema bancoxyz -- ----------------------------------------------------CREATE SCHEMA IF NOT EXISTS `bancoxyz` DEFAULT CHARACTER SET utf8mb4 ; USE `bancoxyz` ; -- ------------------------------------------------------ Table `bancoxyz`.`pais` -- ----------------------------------------------------CREATE TABLE IF NOT EXISTS `bancoxyz`.`pais` ( `idpais` INT(11) NOT NULL AUTO_INCREMENT, `nombre_pais` VARCHAR(45) NOT NULL, PRIMARY KEY (`idpais`), INDEX `index2` (`idpais` ASC)) ENGINE = InnoDB DEFAULT CHARACTER SET = utf8;

-- ------------------------------------------------------ Table `bancoxyz`.`ciudad` -- ----------------------------------------------------CREATE TABLE IF NOT EXISTS `bancoxyz`.`ciudad` ( `idciudad` INT(11) NOT NULL AUTO_INCREMENT, `nombre_ciudad` VARCHAR(45) NOT NULL, `idpais` INT(11) NOT NULL, PRIMARY KEY (`idciudad`), CONSTRAINT `fk_ciudad_pais` FOREIGN KEY (`idpais`) REFERENCES `bancoxyz`.`pais` (`idpais`) ON DELETE CASCADE ON UPDATE CASCADE) ENGINE = InnoDB DEFAULT CHARACTER SET = utf8;

FACULTAD DE INGENIERÍA Y CIENCIAS BÁSICAS

PROYECTO GRUPAL

Persistencia y Datos Transaccionales

-- ------------------------------------------------------ Table `bancoxyz`.`cliente` -- ----------------------------------------------------CREATE TABLE IF NOT EXISTS `bancoxyz`.`cliente` ( `cedula` INT(11) NOT NULL, `cod_cliente` INT(11) NOT NULL, `nombre_cliente` VARCHAR(45) NOT NULL, `apellido_cliente` VARCHAR(45) NOT NULL, `dirección` VARCHAR(45) NOT NULL, `ciudad` INT(11) NOT NULL, PRIMARY KEY (`cedula`), CONSTRAINT `fk_cliente_ciudad1` FOREIGN KEY (`ciudad`) REFERENCES `bancoxyz`.`ciudad` (`idciudad`) ON DELETE NO ACTION ON UPDATE NO ACTION) ENGINE = InnoDB AUTO_INCREMENT = 4 DEFAULT CHARACTER SET = utf8;

-- ------------------------------------------------------ Table `bancoxyz`.`tipo` -- ----------------------------------------------------CREATE TABLE IF NOT EXISTS `bancoxyz`.`tipo` ( `id_tipo` INT(11) NOT NULL AUTO_INCREMENT, `descripcion` VARCHAR(255) NULL, PRIMARY KEY (`id_tipo`)) ENGINE = InnoDB AUTO_INCREMENT = 6 DEFAULT CHARACTER SET = utf8;

-- ------------------------------------------------------ Table `bancoxyz`.`cuenta` -- ----------------------------------------------------CREATE TABLE IF NOT EXISTS `bancoxyz`.`cuenta` ( `nro_cuenta` INT(11) NOT NULL AUTO_INCREMENT, `cedula` INT(11) NOT NULL, `ingreso` DOUBLE NULL, `egreso` DOUBLE NULL, `saldo` DOUBLE NULL,

FACULTAD DE INGENIERÍA Y CIENCIAS BÁSICAS

PROYECTO GRUPAL

Persistencia y Datos Transaccionales

PRIMARY KEY (`nro_cuenta`), CONSTRAINT `fk_cuenta_cliente1` FOREIGN KEY (`cedula`) REFERENCES `bancoxyz`.`cliente` (`cedula`) ON DELETE NO ACTION ON UPDATE NO ACTION) ENGINE = InnoDB DEFAULT CHARACTER SET = utf8;

-- ------------------------------------------------------ Table `bancoxyz`.`movimiento` -- ----------------------------------------------------CREATE TABLE IF NOT EXISTS `bancoxyz`.`movimiento` ( `nro_cuenta` INT(11) NOT NULL, `fecha` DATETIME NOT NULL, `sequencia` INT NOT NULL, `hora` TIMESTAMP(0) NULL, `valor` DOUBLE NULL, `tipo_id_tipo` INT(11) NOT NULL, CONSTRAINT `fk_movimiento_tipo1` FOREIGN KEY (`tipo_id_tipo`) REFERENCES `bancoxyz`.`tipo` (`id_tipo`) ON DELETE NO ACTION ON UPDATE NO ACTION, CONSTRAINT `fk_movimiento_cuenta1` FOREIGN KEY (`nro_cuenta`) REFERENCES `bancoxyz`.`cuenta` (`nro_cuenta`) ON DELETE NO ACTION ON UPDATE NO ACTION) ENGINE = InnoDB DEFAULT CHARACTER SET = utf8;

-- ------------------------------------------------------ Table `bancoxyz`.`telefono` -- ----------------------------------------------------CREATE TABLE IF NOT EXISTS `bancoxyz`.`telefono` ( `cliente_cedula` INT(11) NOT NULL, `telefono` INT NOT NULL, `tipo` INT NULL, CONSTRAINT `fk_telefono_cliente1` FOREIGN KEY (`cliente_cedula`) REFERENCES `bancoxyz`.`cliente` (`cedula`)

FACULTAD DE INGENIERÍA Y CIENCIAS BÁSICAS

PROYECTO GRUPAL

Persistencia y Datos Transaccionales

ON DELETE NO ACTION ON UPDATE NO ACTION) ENGINE = InnoDB;

SET SQL_MODE=@OLD_SQL_MODE; SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS; SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS;

FACULTAD DE INGENIERÍA Y CIENCIAS BÁSICAS

PROYECTO GRUPAL

Persistencia y Datos Transaccionales

Estado del Arte El análisis del estado de arte para la creación de sockets que aquí se realiza es sobre la investigación referente al tema encontrado en varias fuentes de información, así como los documentos de aula entregados en los escenarios y algunos ejemplos prácticos del método de aplicación



Sockets

Una forma de conseguir que dos programas se transmitan datos, basada en el protocolo TCP/IP, es la programación de sockets. Un socket no es más que un "canal de comunicación" entre dos programas que corren sobre ordenadores distintos o incluso en el mismo ordenador. Desde el punto de vista de programación, un socket no es más que un "fichero" que se abre de una manera especial. Una vez abierto se pueden escribir y leer datos de él con las habituales funciones de read() y write() del lenguaje C. Hablaremos de todo esto con detalle más adelante. Existen básicamente dos tipos de "canales de comunicación" o sockets, los orientados a conexión y los no orientados a conexión. En el primer caso ambos programas deben conectarse entre ellos con un socket y hasta que no esté establecida correctamente la conexión, ninguno de los dos puede transmitir datos. Esta es la parte TCP del protocolo TCP/IP, y garantiza que todos los datos van a llegar de un programa al otro correctamente. Se utiliza cuando la información a transmitir es importante, no se puede perder ningún dato y no importa que los programas se queden

FACULTAD DE INGENIERÍA Y CIENCIAS BÁSICAS

PROYECTO GRUPAL

Persistencia y Datos Transaccionales

"bloqueados" esperando o transmitiendo datos. Si uno de los programas está atareado en otra cosa y no atiende la comunicación, el otro quedará bloqueado hasta que el primero lea o escriba los datos. En el segundo caso, no es necesario que los programas se conecten. Cualquiera de ellos puede transmitir datos en cualquier momento, independientemente de que el otro programa esté "escuchando" o no. Es el llamado protocolo UDP, y garantiza que los datos que lleguen son correctos, pero no garantiza que lleguen todos. Se utiliza cuando es muy importante que el programa no se quede bloqueado y no importa que se pierdan datos. Imaginemos, por ejemplo, un programa que está controlando la temperatura de un horno y envía dicha temperatura a un ordenador en una sala de control para que éste presente unos gráficos de temperatura. Obviamente es más importante el control del horno que el perfecto refresco de los gráficos. El programa no se puede quedar bloqueado sin atender al horno simplemente porque el ordenador que muestra los gráficos esté ocupado en otra cosa. En el ejemplo y a partir de este momento nos referimos únicamente a sockets TCP. Los UDP son básicamente iguales, aunque hay pequeñas diferencias en la forma de abrirlos y de enviar los mensajes. Puedes ver un ejemplo de programación de socket UDP.



Arquitectura Cliente / Servidor

A la hora de comunicar dos programas, existen varias posibilidades para establecer la conexión inicialmente. Una de ellas es la utilizada aquí. Uno de los programas debe estar arrancado y en espera de que otro quiera conectarse a él. Nunca da "el primer paso" en la conexión. Al programa que actúa de esta

FACULTAD DE INGENIERÍA Y CIENCIAS BÁSICAS

PROYECTO GRUPAL

Persistencia y Datos Transaccionales

forma se le conoce como servidor. Su nombre se debe a que normalmente es el que tiene la información que sea disponible y la "sirve" al que se la pida. Por ejemplo, el servidor de páginas web tiene las páginas web y se las envía al navegador que se lo solicite. El otro programa es el que da el primer paso. En el momento de arrancarlo o cuando lo necesite, intenta conectarse al servidor. Este programa se denomina cliente. Su nombre se debe a que es el que solicita información al servidor. El navegador de Internet pide la página web al servidor de Internet. En este ejemplo, el servidor de páginas web se llama servidor porque está (o debería de estar) siempre encendido y pendiente de que alguien se conecte a él y le pida una página. El navegador de Internet es el cliente, puesto que se arranca cuando nosotros lo arrancamos y solicita conexión con el servidor. Resumiendo, servidor es el programa que permanece pasivo a la espera de que alguien solicite conexión con él, normalmente, para pedirle algún dato. Cliente es el programa que solicita la conexión para, normalmente, pedir datos al servidor.



La Conexión

Para poder realizar la conexión entre ambos programas son necesarias varias cosas:  Dirección IP del servidor.  Cada ordenador de una red tiene asignado un número único, que sirve para identificarle y distinguirle de los demás, de forma que cuando un ordenador quiere hablar con otro, manda la información a dicho número. Es similar a nuestros números de teléfono. Si quiero hablar con un amigo primero marco su número de teléfono y luego hablo con él.

FACULTAD DE INGENIERÍA Y CIENCIAS BÁSICAS

PROYECTO GRUPAL

Persistencia y Datos Transaccionales

El servidor no necesita la dirección de ninguno de los dos ordenadores, al igual que nosotros, para recibir una llamada por teléfono, no necesitamos saber el número de nadie, ni siquiera el nuestro. El cliente sí necesita saber el número del servidor, al igual que nosotros para llamar a alguien necesitamos saber su número telefónico. La dirección IP es un número del estilo 192.100.23.4.  ¡Todos lo hemos visto en Internet! En resumidas cuentas, el cliente debe conocer a qué ordenador desea conectarse. En nuestro navegador de Internet facilitamos la dirección IP del servidor al que queremos conectarnos obviamente este nombre hay que traducirlo a una dirección IP, pero nuestro navegador e Internet se encargan de eso por nosotros.  Servicio que queremos crear / utilizar. Cada servicio dentro del ordenador debe tener un número único que lo identifique (como la extensión de teléfono). Estos números son enteros normales y van de 1 a 65535. Los números bajos, desde 1 a 1023 están reservados para servicios habituales de los sistemas operativos (www, ftp, mail, ping, etc). El resto están a disposición del programador. Tanto el servidor como el cliente deben conocer el número del servicio al que atienden o se conectan. El servidor le indica al sistema operativo qué servicio quiere atender, al igual que en una empresa el empleado recién contratado (o alguien en su lugar) debe informar a la telefonista en qué extensión

se

encuentra.

El cliente, cuando llame a la empresa, debe dar el número de extensión (o nombre de empleado), de forma que la telefonista le ponga con la persona adecuada. En el caso del navegador de Internet, estamos indicando el servicio con la www, servicio de páginas web. También es posible, por ejemplo "ftp.chuidiang.com", si chuidiang.com admite clientes ftp. Nuestro

FACULTAD DE INGENIERÍA Y CIENCIAS BÁSICAS

PROYECTO GRUPAL

Persistencia y Datos Transaccionales

ordenador es lo suficientemente listo como para saber a qué número corresponden esos servicios habituales. 

El Servidor

Con C en Unix/Linux, los pasos que debe seguir un programa servidor son los siguientes: Apertura de un socket, mediante la función socket(). Esta función devuelve un descriptor de fichero normal, como puede devolverlo open(). La función socket() no hace absolutamente nada, salvo devolvernos y preparar un descriptor de fichero que el sistema posteriormente asociará a una conexión en red. Avisar al sistema operativo de que hemos abierto un socket y queremos que asocie nuestro programa a dicho socket. Se consigue mediante la función bind(). El sistema todavía no atenderá a las conexiones de clientes, simplemente anota que cuando empiece a hacerlo, tendrá que avisarnos a nosotros. Es en esta llamada cuando se debe indicar el número de servicio al que se quiere atender. Avisar al sistema de que comience a atender dicha conexión de red. Se consigue mediante la función listen(). A partir de este momento el sistema operativo anotará la conexión de cualquier cliente para pasárnosla cuando se lo pidamos. Si llegan clientes más rápido de lo que somos capaces de atenderlos, el sistema operativo hace una "cola" con ellos y nos los irá pasando según vayamos pidiéndolo. Pedir y aceptar las conexiones de clientes al sistema operativo. Para ello hacemos una llamada a la función accept(). Esta función le indica al sistema operativo que nos dé al siguiente cliente de la cola. Si no hay clientes se quedará bloqueada hasta que algún cliente se conecte.

FACULTAD DE INGENIERÍA Y CIENCIAS BÁSICAS

PROYECTO GRUPAL

Persistencia y Datos Transaccionales

Escribir y recibir datos del cliente, por medio de las funciones write() y read(), que son exactamente las mismas que usamos para escribir o leer de un fichero. Obviamente, tanto cliente como servidor deben saber qué datos esperan recibir, qué datos deben enviar y en qué formato. Puedes ver cómo se pueden poner de acuerdo en estos mensajes en el apartado de mensajes. Cierre de la comunicación y del socket, por medio de la función close(), que es la misma que sirve para cerrar un fichero.



El Cliente

Los pasos que debe seguir un programa cliente son los siguientes:  Apertura de un socket, como el servidor, por medio de la función socket()  Solicitar conexión con el servidor por medio de la función connect(). Dicha función quedará bloqueada hasta que el servidor acepte nuestra conexión o bien si no hay servidor en el sitio indicado, saldrá dando un error. En esta llamada se debe facilitar la dirección IP del servidor y el número de servicio que se desea.  Escribir y recibir datos del servidor por medio de las funciones write() y read().  Cerrar la comunicación por medio de close().

FACULTAD DE INGENIERÍA Y CIENCIAS BÁSICAS

PROYECTO GRUPAL



Persistencia y Datos Transaccionales

Diagrama de Flujo

SOCKET

AVISA SI HAY MAS DE UN SOCKET

APERTURA PARA ATENDER SOCKETS

SERVIDOR

CLIENTE

SOCKET

CONEXION AL SERVIDOR

ACEPTAR CONEXION IMPRESION PARA INGRESAR DATOS

ESPERA ESCRIBE RESPUESTAS

IMPRESION ESTADO DE LA CONEXION LEE RESPUESTAS

RECIBE RESULTADOS

ENVIA RESULTADOS

ENVIA RESULTADOS

RECIBE RESULTADOS

IMPRIME RESULTADOS

IMPRIME RESULTADOS

CIERRA LA COMUNICACION

CIERRA LA COMUNICACION

FACULTAD DE INGENIERÍA Y CIENCIAS BÁSICAS

PROYECTO GRUPAL



Persistencia y Datos Transaccionales

Ejemplo

En el ejemplo siguiente se crea un socket que se puede usar para comunicarse en una red basada en TCP/IP, como Internet. C# Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); Para usar UDP en lugar de TCP, cambie el tipo de protocolo, como en el ejemplo siguiente: C# Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp); La enumeración AddressFamily especifica las familias de direcciones estándar usadas por la clase Socket para resolver direcciones de red (por ejemplo, el miembro AddressFamily.InterNetwork especifica la familia de direcciones IP de versión 4). La enumeración SocketType especifica el tipo de socket (por ejemplo, el miembro SocketType.Stream indica un socket estándar para enviar y recibir datos con control de flujo). La enumeración ProtocolType especifica el protocolo de red que se va a usar al comunicarse en el Socket (por ejemplo, ProtocolType.Tcp indica que el socket usa TCP y ProtocolType.Udp indica que el socket usa UDP). Una vez que se ha creado un socket, puede iniciar una conexión con un punto de conexión remoto o recibir conexiones procedentes de dispositivos remotos. En el ejemplo siguiente se crea un socket implementado en java import java.net.*; import java.io.*;

FACULTAD DE INGENIERÍA Y CIENCIAS BÁSICAS

PROYECTO GRUPAL

Persistencia y Datos Transaccionales

/** * * @author Jorge V */ public class Conex { final int PUERTO=5000; ServerSocket sc; Socket so; DataOutputStream salida; String mensajeRecibido; //SERVIDOR public void initServer() { BufferedReader entrada; try { sc = new ServerSocket(PUERTO );/* crea socket servidor que escuchara en puerto 5000*/ so=new Socket(); System.out.println("Esperando una conexión:"); so = sc.accept();

FACULTAD DE INGENIERÍA Y CIENCIAS BÁSICAS

Persistencia y Datos Transaccionales

PROYECTO GRUPAL

Utilización de Sockets Aplicativo mediante el cual se procederá a realizar un prototipo transaccional para simulación de transacciones tales como, consulta, consignación y retiro, en la cual será implementada la base de datos en MySQL conectado a través de java para su funcionamiento, donde en MySQL tenemos relacionada la base de la información para ser consultada por medio de una interfaz de usuario desarrollada en java para su consulta. El código anexado establecido para realizar la conexión con MySQL mostrando la interfaz donde el usuario ingrese los datos y este sea almacenado en la base de datos.



Clase Conectar

package clases; import java.sql.Connection; import java.sql.DriverManager; import javax.swing.JOptionPane; /** * * @author Andrés Duque */ public class conectar {        private static Connection conn;    private static final String driver = "com.mysql.jdbc.Driver"; //conector .jar    private static final String user = "adminpoli@bancopoli"; //usuario    private static final String password = "Datos2018"; // contraseña    private static final String url= "jdbc:mysql://bancopoli.mysql.database.azure.com:3306/bancoxyz"; // lugar de la base de datos, se uso Azure para realizar la conexión remotamente    //Se crea metodo que realizara la conexión llamando las variables usadas para la ralizar la conexión en azure    public conectar() {        conn = null;        try {

FACULTAD DE INGENIERÍA Y CIENCIAS BÁSICAS

PROYECTO GRUPAL

Persistencia y Datos Transaccionales

           Class.forName(driver);            conn= DriverManager.getConnection(url, user,password); // realiza uso de las variables            if(conn !=null){                JOptionPane.showMessageDialog(null, "Conectado a...\n"+ url); // envia mensaje al estar conectado                }        } catch (Exception e) {                        JOptionPane.showMessageDialog(null, "Error al conectar"+ e); // muestra el mensaje de error y su excepción                    }    }    // Retorna la conexión    public  Connection getConnection(){        return conn;    }        //Metodo desconecta con la base de datos    public void desconectar (){        conn = null;        if (conn== null){                        JOptionPane.showMessageDialog(null, "Desconectado...\n"+ url); // Muestra mensaje de desconexión y su url        }        } }



Scripts

-- Agregar un pais INSERT pais (nombre_pais) values ('Colombia'); -- Agregar una ciudad INSERT ciudad (nombre_ciudad, idpais) values ('Bogota', 1); -- Agregar un producto INSERT producto (tipo_producto) values ('Cuenta de ahorros'); -- Agregar un saldo INSERT saldo (saldo, idproducto) values (0,1);

FACULTAD DE INGENIERÍA Y CIENCIAS BÁSICAS

PROYECTO GRUPAL

Persistencia y Datos Transaccionales

-- Agregar un cliente INSERT into cliente (identificacion,nombre_cliente,apellido_cliente, direccion_cliente,telefono_cliente, idciudad,saldo_idsaldo) values (79995552,'Nombre','Apellido','Calle 1 23-23', '30211112', 4, 1); -- Agregar un movimiento INSERT movimiento (fecha_movimiento, valor_movimiento, idsaldo) values (now(),100,6); -- Agregar un movimiento INSERT movimiento (fecha_movimiento, valor_movimiento, idsaldo) values (now(),-100,6);

-- Actualizar el saldo con el utimo moviemiento; UPDATE saldo as a INNER JOIN movimiento as b on a.idsaldo=b.idsaldo set a.saldo = a.saldo+b.valor_movimiento where b.idmovimiento = (select max(idmovimiento) from movimiento where idsaldo=a.idsaldo);

FACULTAD DE INGENIERÍA Y CIENCIAS BÁSICAS

PROYECTO GRUPAL

Persistencia y Datos Transaccionales

Referencias

chuidiang.org. (s.f.). chuidiang.org. Obtenido de http://www.chuidiang.org/clinux/sockets/udp/udp.php docs.microsoft.com. (30 de Marzo de 2017). docs.microsoft.com. Obtenido de https://docs.microsoft.com/es-es/dotnet/framework/network-programming/how-tocreate-a-socket V, J. (7 de Abril de 2011). http://codigoprogramacion.com. Obtenido de http://codigoprogramacion.com/cursos/java/103-sockets-en-java-con-cliente-yservidor.html#.WxWvUiAh3IU