在 Java 中创建 PPTP 连接

在本文中,我们将学习如何使用 Java 创建点对点隧道协议 (PPTP) 连接。
为什么我们需要 PPTP 连接
点对点隧道协议用于将压缩和加密的点对点协议 (PPP) 数据包封装成 IP 数据报,以便通过 Internet 发送。
IP 数据报在网络上保持路由,直到它们到达连接到专用网络和 Internet 的点对点隧道协议服务器。
PPTP 服务器将 IP 数据报解构(拆解)为点对点协议 (PPP) 数据包,通过专用网络的网络协议解密 PPP 数据包。请记住,PPTP 支持的专用网络上的网络协议是 TCP/IP
、NetBEUI
、IPX
。
本教程将使用 TCP/IP
连接。所以,让我们从一个实际的例子开始。
在 Java 中创建 PPTP 连接
示例代码(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);
}
}
示例代码(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();
}
}
输出:
在这里,客户端将消息发送为 Is it working?
服务器以 Yes
响应。
怎么会这样?让我们了解 client.java
和 server.java
类中发生了什么。
在 client.java
类中,我们使用一个名为 Socket
的类来连接服务器。Socket
类有两个参数,IP 地址和 TCP 端口号。
IP 地址是指服务器的地址。我们在同一台机器上运行这两个程序(client.java
和 server.java
);这就是我们写 localhost
的原因。
TCP 端口号显示在服务器上执行的应用程序。
我们可以使用从 0
到 64535
的任何端口号。我们在本教程中使用 5000
。
为了通过套接字连接进行通信,我们使用流进行输入和输出。为什么?我们正在实现双向通信(客户端到服务器和服务器到客户端)。
在 server.java
类中,我们需要两个套接字。一个是 Socket
类的简单套接字,用于与客户端通信,另一个是等待客户端请求的 ServerSocket
。
当客户端使用 new Socket(IP address, port number)
创建 Socket
类的新对象时,服务器端会收到这些请求。
在使用 getInputStream()
函数接受来自套接字的输入之前,accept()
函数会阻塞并一直等待,直到客户端与服务器连接。在这里,我们使用输入和输出流从客户端获取数据并将数据发送到客户端。
你可能有一个问题:为什么我们需要客户端和服务器的流?这是因为原始数据无法通过网络发送。
数据需要转换为流,以便从客户端到服务器和服务器到客户端进行通信。