Уласны пратакол TCP можа праходзіць праз HTTP-проксі, калі гэты проксі дазваляе CONNECT да прызначэння. Пратакол прыкладання не абавязаны станавіцца HTTP: HTTP усталёўвае тунэль, а затым прыкладанне абменьваецца ўласнымі байтамі ўнутры яго.

OpenJDK 25 прадастаўляе шлях праз HTTP-проксі ў Socket(Proxy). Яго рэалізацыя выконвае абмен CONNECT і вяртае падключаны сокет для выкарыстання прыкладаннем.

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 адправіла б HTTP-тэкст службе пасля таго, як JDK ужо ўсталяваў тунэль.

Прыклад прадастаўляе тайм-аўт злучэння і тайм-аўт чытання сокета; гэта асобныя сродкі кіравання, а не адзін агульны дэдлайн для сеанса прыкладання.

Дазвол CONNECT па-ранейшаму належыць проксі. Адрас, які перасылае звычайныя вэб-запыты, можа адхіліць порт службы або запатрабаваць аўтэнтыфікацыі перад адкрыццём тунэля. Трымайце гэтыя збоі асобна ад сервера, які прымае тунэль, але потым адхіляе пратакол вашага прыкладання.

Калі гэтаму пратаколу патрэбен TLS, узгадніце TLS праз падключаны сокет з патрэбным імем хоста службы і звычайнымі праверкамі сертыфікатаў. Адзін CONNECT не шыфруе паток. Для сапраўднага HTTP API HTTP-кліент застаецца больш зручным інтэрфейсам, бо ён таксама апрацоўвае HTTP-паведамленні.

Падобныя артыкулы