Protokol TCP tersuai boleh merentasi proxy HTTP apabila proxy itu membenarkan CONNECT ke destinasi. Protokol aplikasi tidak perlu menjadi HTTP: HTTP membina terowong, kemudian aplikasi menukar baitnya sendiri di dalamnya.

OpenJDK 25 menyediakan laluan proxy HTTP dalam Socket(Proxy). Pelaksanaannya melakukan pertukaran CONNECT dan memulangkan soket bersambung untuk digunakan oleh aplikasi.

Proxy route = new Proxy(
    Proxy.Type.HTTP,
    new InetSocketAddress("proxy.example", 8080));

try (Socket socket = new Socket(route)) {
    socket.setSoTimeout(10000);
    socket.connect(
        InetSocketAddress.createUnresolved("tcp-service.example", 8443),
        5000);
    InputStream input = socket.getInputStream();
    OutputStream output = socket.getOutputStream();
}

Coretan ini menggunakan kelas daripada java.net dan java.io. Gantikan kedua-dua titik akhir dan lakukan pertukaran protokol sebelum meninggalkan blok try. Untuk sasaran TCP awam yang dibenarkan, pilih calon HTTP daripada senarai proxy HTTP hanya selepas menyemak kebenaran CONNECT bagi port sasaran itu. Alamat proxy ialah tempat Java bersambung dahulu; alamat yang dihantar kepada connect mengenal pasti perkhidmatan yang perlu dicapai oleh proxy.

Destinasi yang belum diselesaikan mengekalkan nama hosnya untuk permintaan CONNECT pelaksanaan ini. Sebaliknya InetSocketAddress yang telah diselesaikan membekalkan alamat IP yang telah diselesaikannya kepada permintaan itu. Perbezaan itu penting apabila proxy perlu menyelesaikan nama perkhidmatan atau menggunakan dasar berasaskan nama hos.

Apa yang ditinggalkan oleh sambungan yang berjaya

Strim yang terhasil membawa data perkhidmatan yang diterowongkan. Ia tidak mendedahkan respons HTTP berasingan yang perlu dibaca dan dibuang oleh aplikasi anda. Menambah pertukaran CONNECT kedua akan menghantar teks HTTP kepada perkhidmatan selepas JDK telah pun membina terowong.

Contoh menetapkan had masa sambungan dan had masa bacaan soket; kedua-duanya kawalan berasingan, bukan satu tarikh akhir menyeluruh untuk sesi aplikasi.

Kebenaran CONNECT masih milik proxy. Titik akhir yang memajukan permintaan web biasa mungkin menolak port perkhidmatan atau memerlukan pengesahan sebelum membuka terowong. Asingkan kegagalan itu daripada pelayan yang menerima terowong tetapi kemudian menolak protokol aplikasi anda.

Jika protokol itu memerlukan TLS, rundingkan TLS melalui soket bersambung dengan nama hos yang dimaksudkan oleh perkhidmatan dan pemeriksaan sijil biasa. CONNECT sahaja tidak menyulitkan strim. Untuk HTTP API sebenar, klien HTTP kekal sebagai antara muka yang lebih memudahkan kerana ia juga mengendalikan mesej HTTP.

Artikel berkaitan