Özel bir TCP protokolü, proxy hedefe CONNECT'e izin verdiğinde bir HTTP proxy üzerinden geçebilir. Uygulama protokolünün HTTP'ye dönüşmesi gerekmez: HTTP tüneli kurar, ardından uygulama kendi baytlarını tünelin içinde değiş tokuş eder.

OpenJDK 25, Socket(Proxy) içinde bir HTTP proxy yolu sunar. Uygulaması CONNECT alışverişini gerçekleştirir ve uygulamanın kullanması için bağlı bir soket döndürür.

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

Bu parça java.net ve java.io sınıflarını kullanır. İki uç noktayı değiştirin ve try bloğundan çıkmadan önce protokol alışverişini yapın. İzin verilen genel bir TCP hedefi için, hedefin bağlantı noktası için CONNECT iznini denetledikten sonra HTTP proxy listesinden HTTP adaylarını seçin. Proxy adresi Java'nın ilk bağlandığı yerdir; connect öğesine verilen adres, proxy'nin ulaşması gereken hizmeti tanımlar.

Çözümlenmemiş hedef, bu uygulamanın CONNECT isteği için ana bilgisayar adını korur. Çözümlenmiş bir InetSocketAddress ise bunun yerine çözümlenmiş IP adresini o isteğe verir. Bu ayrım, proxy hizmet adını çözümlemek zorunda olduğunda veya ana bilgisayar adına dayalı bir ilke uyguladığında önemlidir.

Başarılı bir bağlantı size ne bırakır

Ortaya çıkan akışlar tünellenen hizmetin verilerini taşır. Uygulamanızın okuyup atması gereken ayrı bir HTTP yanıtı sunmazlar. İkinci bir CONNECT alışverişi eklemek, JDK tüneli zaten kurduktan sonra hizmete HTTP metni gönderirdi.

Örnek bir bağlantı zaman aşımı ve bir soket okuma zaman aşımı belirler; bunlar ayrı denetimlerdir, uygulama oturumu için tek bir genel son tarih değildir.

CONNECT izni hâlâ proxy'ye aittir. Sıradan web isteklerini ileten bir uç nokta, hizmetin bağlantı noktasını reddedebilir veya tünel açmadan önce kimlik doğrulama isteyebilir. Bu hataları, tüneli kabul edip daha sonra uygulama protokolünüzü reddeden bir sunucudan ayrı tutun.

Bu protokol TLS gerektiriyorsa, bağlı soket üzerinden hizmetin amaçlanan ana bilgisayar adı ve olağan sertifika denetimleriyle TLS anlaşması yapın. CONNECT tek başına akışı şifrelemez. Gerçek bir HTTP API için, HTTP iletilerini de işlediği için HTTP istemcisi daha elverişli arabirim olmaya devam eder.

İlgili makaleler