在Java中,可以使用Socket类来实现端口转发。以下是一个简单的示例代码,演示了如何将本地的一个端口转发到另一个远程主机的端口。
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
public class PortForwardingExample {
public static void main(String[] args) {
int localPort = 12345; // 本地端口
String remoteHost = "example.com"; // 远程主机
int remotePort = 80; // 远程端口
try {
// 创建本地服务器套接字
ServerSocket serverSocket = new ServerSocket(localPort);
System.out.println("等待客户端连接...");
while (true) {
// 监听客户端连接
Socket clientSocket = serverSocket.accept();
System.out.println("客户端连接成功!");
// 创建与远程主机的套接字连接
Socket remoteSocket = new Socket(remoteHost, remotePort);
// 创建线程进行数据转发
Thread inputThread = new Thread(new ForwardingHandler(clientSocket.getInputStream(), remoteSocket.getOutputStream()));
Thread outputThread = new Thread(new ForwardingHandler(remoteSocket.getInputStream(), clientSocket.getOutputStream()));
inputThread.start();
outputThread.start();
}
} catch (IOException e) {
e.printStackTrace();
}
}
// 数据转发处理器
static class ForwardingHandler implements Runnable {
private final InputStream input;
private final OutputStream output;
public ForwardingHandler(InputStream input, OutputStream output) {
this.input = input;
this.output = output;
}
@Override
public void run() {
byte[] buffer = new byte[4096];
int bytesRead;
try {
while ((bytesRead = input.read(buffer)) != -1) {
output.write(buffer, 0, bytesRead);
output.flush();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
上述代码创建一个ServerSocket对象来监听本地指定端口上的连接。当有客户端连接成功后,会通过Socket对象与远程主机建立连接。然后,创建两个线程来分别处理从客户端到远程主机和从远程主机到客户端的数据转发。数据转发处理器实现了Runnable接口,通过读取输入流的数据,并将其写入输出流来实现转发。