Crear conexión PPTP en Java
En este artículo, aprenderemos cómo crear una conexión de protocolo de túnel punto a punto (PPTP) usando Java.
Por qué necesitamos una conexión PPTP
El Protocolo de tunelización punto a punto se utiliza para encapsular el paquete del Protocolo punto a punto (PPP) comprimido y encriptado en datagramas IP para enviarlos a través de Internet.
Los datagramas IP siguen enrutándose por la red hasta llegar al Servidor de Protocolo de Tunelización Punto a Punto, conectado a la red privada e Internet.
El servidor PPTP deconstruye (desensambla) el datagrama IP en un paquete de protocolo punto a punto (PPP) y descifra el paquete PPP a través del protocolo de red de la red privada. Recuerde, el protocolo de red en una red privada compatible con PPTP es TCP/IP
, NetBEUI
, IPX
.
Este tutorial utilizará una conexión TCP/IP
. Entonces, comencemos con un ejemplo práctico.
Crear conexión PPTP en Java
Código de ejemplo (client.java
):
import java.io.*;
import java.net.*;
public class client {
public static void main(String[] args) throws IOException {
Socket socket = new Socket("localhost", 5000);
PrintWriter printWriter = new PrintWriter(socket.getOutputStream());
printWriter.println("Is it working?");
printWriter.flush();
InputStreamReader in = new InputStreamReader(socket.getInputStream());
BufferedReader bufferReader = new BufferedReader(in);
String str = bufferReader.readLine();
System.out.println("server : " + str);
}
}
Código de ejemplo (server.java
):
import java.io.*;
import java.net.*;
public class server {
public static void main(String[] args) throws IOException {
ServerSocket serverSocket = new Socket(5000);
Socket socket = serverSocket.accept();
System.out.println("client connected");
InputStreamReader in = new InputStreamReader(socket.getInputStream());
BufferedReader bufferReader = new BufferedReader(in);
String str = bufferReader.readLine();
System.out.println("client : " + str);
PrintWriter printWriter = new PrintWriter(socket.getOutputStream());
printWriter.println("Yes");
printWriter.flush();
}
}
Producción:
Aquí, el cliente envía el mensaje como Is it working?
y el servidor responde con Yes
.
¿Cómo? Entendamos qué sucede en las clases client.java
y server.java
.
En la clase client.java
, usamos una clase llamada Socket
para conectarnos con el servidor. La clase Socket
toma dos parámetros, la dirección IP y un número de puerto TCP.
Dirección IP significa la dirección del servidor. Estamos ejecutando ambos programas (client.java
y server.java
) en la misma máquina; por eso escribimos localhost
.
El número de puerto TCP muestra la aplicación ejecutada en el servidor.
Podemos usar cualquier número de puerto que va desde 0
a 64535
. Estamos usando 5000
en este tutorial.
Para fines de comunicación a través de la conexión de socket, estamos utilizando flujos para entrada y salida. ¿Por qué? Estamos implementando una comunicación bidireccional (cliente a servidor y servidor a cliente).
En la clase server.java
necesitamos dos sockets. Uno es un socket simple de la clase Socket
que se utilizará para la comunicación con el cliente, y el otro es ServerSocket
que espera las solicitudes del cliente.
Estas solicitudes se reciben en el lado del servidor cuando un cliente crea un nuevo objeto de la clase Socket
utilizando new Socket(IP address, port number)
.
Antes de usar la función getInputStream()
para aceptar la entrada del socket, la función accept()
se bloquea y permanece hasta que el cliente se conecta con el servidor. Aquí, estamos utilizando flujos de entrada y salida para obtener los datos del cliente y enviarlos al cliente.
Es posible que tenga una pregunta: ¿Por qué necesitamos flujos para el cliente y el servidor? Es porque los datos sin procesar no se pueden enviar a través de la red.
Los datos deben convertirse en flujos para comunicarse de cliente a servidor y de servidor a cliente.