jairogarcíarincón
03/12/2018
Contenidos
- Introducción a JavaFX y Prerrequisitos
- LibretaDirecciones: Creación del proyecto y configuración
- LibretaDirecciones: Modelo y Lista de personas
- LibretaDirecciones: Interacción con el usuario
- LibretaDirecciones: Hojas de estilo CSS
- LibretaDirecciones: Persistencia de datos con XML
- LibretaDirecciones: Gráficos e Informes
- LibretaDirecciones: Despliegue
- LibretaDirecciones: Persistencia con base de datos con MySQL (local)
- LibretaDirecciones: Persistencia con base de datos con MySQL (remota)
Siguiendo con la clase anterior, en esta clase veremos cómo conectarnos a una base de datos remota.
Para ello, dado que nuestro servidor de base de datos se encuentra a su vez en un servidor remoto, debemos llevar a cabo 3 pasos:
- Conectar al servidor remoto mediante SSH
- Redireccionar (port-forwarding) el puerto del servidor de base de datos remoto a otro puerto local diferente (para evitar conflicto con nuestro servidor local)
- Conectar a la base de datos remota
El resto de procesos (lectura y escritura en base de datos) es idéntico al caso local.
Para conectarnos a un servidor por SSH, necesitamos los siguientes datos:
- Puerto (normalmente 22, pero en algunos casos puede ser diferente)
- Dirección IP
- Usuario
- Archivo de par de claves SSH (*.pem o *.ppk)
Además, haremos uso de la librería JSCH (Java Secure Channel), que puedes descargar desde el apartado Downloads de la página de JCraft.
Una vez que tengas todos esos datos y la librería agregada a tu proyecto, crea una nueva clase llamada ConexionSsh dentro del package util con el siguiente código (sustituyendo los strings por los valores reales de tu servidor):
package util;
import com.jcraft.jsch.JSch;
import com.jcraft.jsch.JSchException;
import com.jcraft.jsch.Session;
import java.sql.Connection;
/**
*
* @author jairogarciarincon
*/
public class ConexionSsh {
private static Session sesion = null;
private static Connection conexion = null;
String hostSsh = "la-direccion-ip-del-servidor-remoto";
String usuarioSsh = "el-usuario-ssh";
int puertoSsh = 22; /* en el caso de CEU, usa el 990 */
String keySsh = "la-ruta-a-tu-archivo-de-par-de-claves";
String hostRemoto = "127.0.0.1";
int puertoLocal = 8740; // cualquier puerto vacío para redireccionar
int puertoRemoto = 3306;
public int puertoAsignado; //para la conexión sql
public ConexionSsh() throws JSchException{
java.util.Properties config = new java.util.Properties();
JSch jsch = new JSch();
//Inicio sesión ssh
sesion = jsch.getSession(usuarioSsh, hostSsh, puertoSsh);
jsch.addIdentity(keySsh);
config.put("StrictHostKeyChecking", "no");
config.put("ConnectionAttempts", "3");
sesion.setConfig(config);
sesion.connect();
System.out.println("SSH conectado");
//Redirección de puerto
puertoAsignado = sesion.setPortForwardingL(puertoLocal, hostRemoto, puertoRemoto);
System.out.println("Puerto asignado: "+ puertoAsignado);
}
public static void cerrar() {
if (sesion != null && sesion.isConnected()) {
sesion.disconnect();
System.out.println("SSH desonectado");
}
}
}
Como ves, el método constructor incluye tanto la conexión SSH como la redirección del puerto (necesaria si tienes un servidor de bases de datos local para evitar conflictos).
Para finalizar conectándonos a la base de datos remota, modifica el método start() de LibretaDirecciones (antes de llamar al método initLayoutPrincipal()) para que incluya la conexión SSH y la conexión SQL (comenta la conexión local anterior):
//Establezco la conexión SSH
conexionSsh = new ConexionSsh();
//Establezco conexión con la base de datos local
//conexionSql = new ConexionSql("jdbc:mysql://127.0.0.1:3306/dam?useSSL=false", "dam", "dam");
//Establezco conexión con la base de datos remota
conexionSql = new ConexionSql("jdbc:mysql://127.0.0.1:"+ conexionSsh.puertoAsignado +"/dam?useSSL=false", "dam", "dam");
Si ahora ejecutas la aplicación, deberías ver un mensaje de SSH Conectado, el puerto asignado y el mensaje Base de datos conectada.
Como hemos comentado antes, el proceso de lectura y escritura es similar al anterior.
Publicado el 30 de Enero de 2025
xmlinterfacesjavafx