อุโมงค์ Java Socket HTTP CONNECT ใน OpenJDK 25
ใช้เส้นทางซ็อกเก็ตผ่านพร็อกซี HTTP ใน OpenJDK 25 เพื่อไปยังบริการ TCP ที่ได้รับอนุญาต โดยแยกปลายทางของพร็อกซีกับจุดหมายออกจากกัน
โปรโตคอล 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 ได้ด้วย