Mukautettu TCP-protokolla voi kulkea HTTP-välityspalvelimen läpi, kun välityspalvelin sallii CONNECT-yhteyden kohteeseen. Sovelluksen protokollan ei tarvitse muuttua HTTP:ksi: HTTP muodostaa tunnelin, ja sen jälkeen sovellus vaihtaa omat tavunsa sen sisällä.

OpenJDK 25 tarjoaa HTTP-välityspalvelinpolun Socket(Proxy)-luokassa. Sen toteutus tekee CONNECT-vaihdon ja palauttaa yhdistetyn socketin sovelluksen käyttöön.

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

Tämä katkelma käyttää luokkia java.net- ja java.io-paketeista. Korvaa molemmat päätepisteet ja tee protokollavaihto ennen try-lohkosta poistumista. Sallitulle julkiselle TCP-kohteelle valitse HTTP-ehdokkaat HTTP-välityspalvelinluettelosta vasta kun olet tarkistanut CONNECT-oikeuden kyseisen kohteen porttiin. Välityspalvelimen osoite on se, mihin Java yhdistää ensin; connect-metodille annettu osoite yksilöi palvelun, johon välityspalvelimen pitää päästä.

Ratkaisematon kohde säilyttää isäntänimensä tämän toteutuksen CONNECT-pyyntöä varten. Ratkaistu InetSocketAddress sen sijaan toimittaa pyyntöön ratkaistun IP-osoitteensa. Tämä ero on merkityksellinen, kun välityspalvelimen täytyy ratkaista palvelun nimi tai soveltaa isäntänimeen perustuvaa käytäntöä.

Mitä onnistunut yhteys jättää sinulle

Tuloksena syntyvät virrat kuljettavat tunneloidun palvelun dataa. Ne eivät paljasta erillistä HTTP-vastausta, jonka sovelluksesi pitäisi lukea ja hylätä. Toisen CONNECT-vaihdon lisääminen lähettäisi HTTP-tekstiä palvelulle sen jälkeen, kun JDK on jo muodostanut tunnelin.

Esimerkki asettaa yhteysaikarajan ja socketin lukuaikarajan; ne ovat erillisiä säätimiä, eivät yksi yhteinen määräaika sovellusistunnolle.

CONNECT-oikeus kuuluu edelleen välityspalvelimelle. Tavallisia verkkopyyntöjä välittävä päätepiste voi hylätä palvelun portin tai vaatia todennuksen ennen tunnelin avaamista. Pidä nämä epäonnistumiset erillään palvelimesta, joka hyväksyy tunnelin mutta hylkää myöhemmin sovellusprotokollasi.

Jos tämä protokolla tarvitsee TLS:n, neuvottele TLS yhdistetyn socketin kautta palvelun aiottua isäntänimeä ja tavallisia varmenne­tarkistuksia käyttäen. Pelkkä CONNECT ei salaa virtaa. Todelliselle HTTP-rajapinnalle HTTP-asiakas on edelleen kätevin käyttöliittymä, koska se käsittelee myös HTTP-viestit.

Aiheeseen liittyvät artikkelit