Erstellen eine PPTP-Verbindung in Java
In diesem Artikel erfahren Sie, wie Sie mit Java eine PPTP-Verbindung (Point-to-Point Tunneling Protocol) erstellen.
Warum wir eine PPTP-Verbindung brauchen
Das Point-to-Point Tunneling Protocol wird verwendet, um das komprimierte und verschlüsselte PPP-Paket (Point-to-Point Protocol) in IP-Datagramme zum Senden über das Internet einzukapseln.
Die IP-Datagramme werden weiter über das Netzwerk geroutet, bis sie den Point-to-Point Tunneling Protocol Server erreichen, der mit dem privaten Netzwerk und dem Internet verbunden ist.
Der PPTP-Server dekonstruiert (zerlegt) das IP-Datagramm in ein PPP-Paket (Point-to-Point Protocol) und entschlüsselt das PPP-Paket über das Netzwerkprotokoll des privaten Netzwerks. Denken Sie daran, dass das Netzwerkprotokoll in einem privaten Netzwerk, das von PPTP unterstützt wird, TCP/IP
, NetBEUI
, IPX
ist.
Dieses Tutorial verwendet eine TCP/IP
-Verbindung. Beginnen wir also mit einem praktischen Beispiel.
Erstellen eine PPTP-Verbindung in Java
Beispielcode (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);
}
}
Beispielcode (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();
}
}
Ausgabe:
Hier sendet der Client die Nachricht als Is it working?
und der Server antwortet mit Yes
.
Wie? Lassen Sie uns verstehen, was in den Klassen client.java
und server.java
passiert.
In der Klasse client.java
verwenden wir eine Klasse namens Socket
, um uns mit dem Server zu verbinden. Die Klasse Socket
nimmt zwei Parameter entgegen, die IP-Adresse und eine TCP-Portnummer.
IP-Adresse bedeutet die Adresse des Servers. Wir führen beide Programme (client.java
& server.java
) auf demselben Rechner aus; deshalb haben wir localhost
geschrieben.
Die TCP-Portnummer zeigt die auf dem Server ausgeführte Anwendung an.
Wir können jede Portnummer von 0
bis 64535
verwenden. Wir verwenden in diesem Tutorial 5000
.
Für Kommunikationszwecke über die Socket-Verbindung verwenden wir Streams sowohl für die Eingabe als auch für die Ausgabe. Wieso den? Wir implementieren eine bidirektionale Kommunikation (Client zu Server & Server zu Client).
In der Klasse server.java
benötigen wir zwei Sockets. Einer ist ein einfacher Socket der Klasse Socket
, der für die Kommunikation mit dem Client verwendet wird, und der andere ist ServerSocket
, der auf die Anfragen des Clients wartet.
Diese Anfragen werden serverseitig empfangen, wenn ein Client ein neues Objekt der Klasse Socket
erstellt, indem er new Socket(IP address, port number)
verwendet.
Bevor die Funktion getInputStream()
verwendet wird, um Eingaben vom Socket zu akzeptieren, blockiert die Funktion accept()
und wartet, bis der Client eine Verbindung mit dem Server herstellt. Hier verwenden wir Eingabe- und Ausgabeströme, um die Daten vom Client abzurufen und Daten an den Client zu senden.
Sie haben vielleicht eine Frage: Warum brauchen wir Streams für Client und Server? Dies liegt daran, dass die Rohdaten nicht über das Netzwerk gesendet werden können.
Die Daten müssen in Streams konvertiert werden, um von Client zu Server und von Server zu Client zu kommunizieren.