Жеке TCP протоколы прокси межелі орынға CONNECT рұқсат еткенде HTTP прокси арқылы өте алады. Қолданба протоколы HTTP болуы міндетті емес: HTTP туннельді орнатады, содан кейін қолданба өз байттарын оның ішінде алмасады.

OpenJDK 25 Socket(Proxy) ішінде HTTP прокси жолын ұсынады. Оның іске асырылуы CONNECT алмасуын орындайды және қолданба пайдалануы үшін қосылған socket қайтарады.

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

Бұл үзінді java.net және java.io кластарын пайдаланады. Екі шеткі нүктені ауыстырып, try блогынан шығар алдында протокол алмасуын орындаңыз. Рұқсат етілген жалпыға ортақ TCP мақсаты үшін HTTP прокси тізімінен HTTP үміткерлерін сол мақсаттың портына CONNECT рұқсатын тексергеннен кейін ғана таңдаңыз. Прокси мекенжайы — Java алғаш қосылатын жер; connect-ке берілетін мекенжай прокси жетуі тиіс қызметті анықтайды.

Шешілмеген межелі орын осы іске асырудың CONNECT сұрауы үшін хост атауын сақтайды. Ал шешілген InetSocketAddress оның орнына сол сұрауға шешілген IP мекенжайын береді. Бұл айырмашылық прокси қызмет атауын шешуі немесе хост атауына негізделген саясатты қолдануы қажет болғанда маңызды.

Сәтті қосылу сізге нені қалдырады

Алынған ағындар туннельденген қызметтің деректерін тасымалдайды. Олар қолданбаңыз оқып, тастауы тиіс бөлек HTTP жауабын көрсетпейді. Екінші CONNECT алмасуын қосу JDK туннельді әлдеқашан орнатқаннан кейін қызметке HTTP мәтінін жіберер еді.

Мысал қосылу уақыт шегін және socket оқу уақыт шегін береді; бұлар жеке басқару құралдары, қолданба сессиясы үшін бір жалпы мерзім емес.

CONNECT рұқсаты әлі де проксиге тиесілі. Кәдімгі веб сұрауларды жіберетін шеткі нүкте қызмет портын қабылдамауы немесе туннель ашпас бұрын аутентификация талап етуі мүмкін. Бұл сәтсіздіктерді туннельді қабылдап, кейін қолданба протоколыңызды қабылдамайтын серверден бөлек ұстаңыз.

Егер бұл протоколға TLS қажет болса, қосылған socket арқылы қызметтің көзделген хост атауымен және әдеттегі сертификат тексерулерімен TLS келісіңіз. CONNECT жалғыз өзі ағынды шифрламайды. Нақты HTTP API үшін HTTP клиенті HTTP хабарламаларын да өңдейтіндіктен ыңғайлырақ интерфейс болып қалады.

Қатысты мақалалар