javaでポート転送を実装する方法

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オブジェクトを作成します。クライアントが接続に成功すると、ソケットオブジェクトを介してリモートホストとの接続が確立されます。次に、クライアントからリモートホストと、リモートホストからクライアントへのデータ転送を処理する2つのスレッドを作成します。データ転送プロセッサはRunnableインターフェイスを実装し、入力ストリームのデータを読み取り、出力ストリームに書き込むことで転送を実行します。

bannerAds