Java Socket HTTP CONNECT-tunneler i OpenJDK 25
Bruk HTTP-proxy-socketbanen i OpenJDK 25 for å nå en tillatt TCP-tjeneste, mens proxy-endepunktet og målet holdes atskilt.
En tilpasset TCP-protokoll kan reise gjennom en HTTP-proxy når proxyen tillater CONNECT til målet. Applikasjonsprotokollen trenger ikke å bli HTTP: HTTP etablerer tunnelen, og deretter utveksler applikasjonen sine egne byte inne i den.
OpenJDK 25 tilbyr en HTTP-proxy-bane i Socket(Proxy). Implementasjonen utfører CONNECT-utvekslingen og returnerer en tilkoblet socket som applikasjonen kan bruke.
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();
}Dette utdraget bruker klasser fra java.net og java.io. Erstatt de to endepunktene og utfør protokollutvekslingen før du forlater try-blokken. For et tillatt offentlig TCP-mål velger du HTTP-kandidater fra HTTP-proxylisten først etter å ha kontrollert CONNECT-tillatelsen for målets port. Proxyadressen er stedet Java kobler til først; adressen som sendes til connect, identifiserer tjenesten proxyen skal nå.
Den uoppløste destinasjonen beholder vertsnavnet sitt for CONNECT-forespørselen i denne implementasjonen. En oppløst InetSocketAddress leverer i stedet sin oppløste IP-adresse til den forespørselen. Den forskjellen er viktig når proxyen må løse opp tjenestnavnet eller anvende en vertsnavnbasert policy.
Hva en vellykket tilkobling etterlater deg med
Strømmene som oppstår, bærer dataene til den tunnelbaserte tjenesten. De avdekker ikke et eget HTTP-svar som applikasjonen din skal lese og forkaste. Å legge til en ny CONNECT-utveksling ville sendt HTTP-tekst til tjenesten etter at JDK allerede har etablert tunnelen.
Eksempelet setter en tilkoblingstidsgrense og en socket-lesetidsgrense; det er separate kontroller, ikke én samlet frist for applikasjonsøkten.
CONNECT-tillatelsen tilhører fortsatt proxyen. Et endepunkt som videresender vanlige nettforespørsler, kan avvise tjenestens port eller kreve autentisering før en tunnel åpnes. Hold disse feilene atskilt fra en server som godtar tunnelen, men senere avviser applikasjonsprotokollen din.
Hvis den protokollen trenger TLS, forhandle TLS gjennom den tilkoblede socketen med tjenestens tiltenkte vertsnavn og vanlige sertifikatkontroller. CONNECT alene krypterer ikke strømmen. For et ekte HTTP-API er en HTTP-klient fortsatt det mer praktiske grensesnittet fordi det også håndterer HTTP-meldinger.