Đường hầm Java Socket HTTP CONNECT trong OpenJDK 25
Dùng đường socket qua proxy HTTP trong OpenJDK 25 để đến một dịch vụ TCP được phép, đồng thời giữ điểm cuối proxy và đích đến tách biệt.
Một giao thức TCP tùy chỉnh có thể đi qua proxy HTTP khi proxy đó cho phép CONNECT tới đích. Giao thức ứng dụng không cần trở thành HTTP: HTTP thiết lập đường hầm, sau đó ứng dụng trao đổi các byte của chính nó bên trong.
OpenJDK 25 cung cấp đường proxy HTTP trong Socket(Proxy). Cài đặt của nó thực hiện trao đổi CONNECT và trả về một socket đã kết nối để ứng dụng sử dụng.
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();
}Đoạn này dùng các lớp từ java.net và java.io. Thay hai điểm cuối và thực hiện trao đổi giao thức trước khi rời khối try. Với một đích TCP công khai được phép, chỉ chọn ứng viên HTTP từ danh sách proxy HTTP sau khi đã kiểm tra quyền CONNECT cho cổng của đích đó. Địa chỉ proxy là nơi Java kết nối trước tiên; địa chỉ được truyền cho connect xác định dịch vụ mà proxy phải đến.
Đích chưa được phân giải giữ nguyên tên máy chủ cho yêu cầu CONNECT của cài đặt này. Ngược lại, InetSocketAddress đã phân giải cung cấp địa chỉ IP đã phân giải cho yêu cầu đó. Sự khác biệt này quan trọng khi proxy phải phân giải tên dịch vụ hoặc áp dụng chính sách dựa trên tên máy chủ.
Một kết nối thành công để lại cho bạn điều gì
Các luồng nhận được mang dữ liệu của dịch vụ trong đường hầm. Chúng không để lộ một phản hồi HTTP riêng mà ứng dụng của bạn phải đọc và bỏ đi. Thêm một trao đổi CONNECT thứ hai sẽ gửi văn bản HTTP tới dịch vụ sau khi JDK đã thiết lập đường hầm.
Ví dụ đặt thời gian chờ kết nối và thời gian chờ đọc socket; đó là các điều khiển riêng biệt, không phải một hạn chót tổng thể cho phiên ứng dụng.
Quyền CONNECT vẫn thuộc về proxy. Một điểm cuối chuyển tiếp các yêu cầu web thông thường có thể từ chối cổng của dịch vụ hoặc yêu cầu xác thực trước khi mở đường hầm. Hãy giữ những thất bại đó tách biệt với máy chủ chấp nhận đường hầm nhưng sau đó từ chối giao thức ứng dụng của bạn.
Nếu giao thức đó cần TLS, hãy thương lượng TLS qua socket đã kết nối với tên máy chủ dự định của dịch vụ và các kiểm tra chứng chỉ thông thường. Chỉ CONNECT không mã hóa luồng. Với một HTTP API thực sự, máy khách HTTP vẫn là giao diện thuận tiện hơn vì nó cũng xử lý các thông điệp HTTP.