Pasirinktinis TCP protokolas gali keliauti per HTTP proxy, kai tas proxy leidžia CONNECT į paskirties vietą. Programa protokolas neturi tapti HTTP: HTTP sukuria tunelį, tada programa apsikeičia savo baitais jo viduje.

OpenJDK 25 siūlo HTTP proxy kelią Socket(Proxy). Jo įgyvendinimas atlieka CONNECT mainus ir grąžina prijungtą socket, kurį programa gali naudoti.

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();
}

Šis fragmentas naudoja klases iš java.net ir java.io. Pakeiskite abu galinius taškus ir atlikite protokolo mainus prieš išeidami iš try bloko. Leidžiamam viešam TCP tikslui HTTP kandidatus iš HTTP proxy sąrašo rinkitės tik patikrinę CONNECT leidimą to tikslo prievadui. Proxy adresas yra vieta, prie kurios Java prisijungia pirmiausia; connect perduodamas adresas nurodo paslaugą, kurią proxy turi pasiekti.

Neišspręsta paskirties vieta išsaugo savo pagrindinio kompiuterio vardą šio įgyvendinimo CONNECT užklausai. Išspręstas InetSocketAddress vietoj to pateikia tai užklausai savo išspręstą IP adresą. Šis skirtumas svarbus, kai proxy turi išspręsti paslaugos pavadinimą arba taikyti politika, pagrįstą pagrindinio kompiuterio vardu.

Ką palieka sėkmingas prisijungimas

Gauti srautai perneša tuneliu perduodamos paslaugos duomenis. Jie neatskleidžia atskiro HTTP atsakymo, kurį jūsų programa turėtų perskaityti ir išmesti. Pridėjus antrus CONNECT mainus, HTTP tekstas būtų siunčiamas paslaugai po to, kai JDK jau sukūrė tunelį.

Pavyzdys nustato prisijungimo laiko limitą ir socket skaitymo laiko limitą; tai atskiri valdikliai, o ne vienas bendras terminas programos sesijai.

CONNECT leidimas vis dar priklauso proxy. Galinis taškas, kuris persiunčia įprastas žiniatinklio užklausas, gali atmesti paslaugos prievadą arba reikalauti autentifikacijos prieš atidarydamas tunelį. Laikykite šias nesėkmes atskirai nuo serverio, kuris priima tunelį, bet vėliau atmeta jūsų programos protokolą.

Jei tam protokolui reikia TLS, derėkitės dėl TLS per prijungtą socket su numatytu paslaugos pagrindinio kompiuterio vardu ir įprastais sertifikatų patikrinimais. Vien CONNECT neužšifruoja srauto. Tikram HTTP API HTTP klientas išlieka patogesnė sąsaja, nes jis taip pat apdoroja HTTP pranešimus.

Susiję straipsniai