एक कस्टम TCP प्रोटोकॉल HTTP प्रॉक्सी से होकर जा सकता है जब वह प्रॉक्सी गंतव्य तक CONNECT की अनुमति देता है। एप्लिकेशन प्रोटोकॉल को HTTP बनने की आवश्यकता नहीं है: HTTP टनल स्थापित करता है, फिर एप्लिकेशन उसके भीतर अपने बाइट्स का आदान-प्रदान करता है।

OpenJDK 25 Socket(Proxy) में HTTP प्रॉक्सी पथ प्रदान करता है। इसका कार्यान्वयन 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 लक्ष्य के लिए, उस लक्ष्य के पोर्ट के लिए CONNECT अनुमति जाँचने के बाद ही HTTP प्रॉक्सी सूची से HTTP उम्मीदवार चुनें। प्रॉक्सी पता वह स्थान है जहाँ Java पहले कनेक्ट करता है; connect को दिया गया पता उस सेवा की पहचान करता है जहाँ प्रॉक्सी को पहुँचना चाहिए।

असुलझा गंतव्य इस कार्यान्वयन के CONNECT अनुरोध के लिए अपना होस्टनाम सुरक्षित रखता है। इसके बजाय सुलझा हुआ InetSocketAddress उस अनुरोध को अपना सुलझा हुआ IP पता देता है। यह अंतर तब मायने रखता है जब प्रॉक्सी को सेवा का नाम सुलझाना हो या होस्टनाम-आधारित नीति लागू करनी हो।

सफल कनेक्शन आपके पास क्या छोड़ता है

परिणामी स्ट्रीम टनल की गई सेवा का डेटा ले जाती हैं। वे कोई अलग HTTP प्रतिक्रिया उजागर नहीं करतीं जिसे आपके एप्लिकेशन को पढ़कर छोड़ देना चाहिए। दूसरा CONNECT आदान-प्रदान जोड़ने से JDK द्वारा टनल पहले ही स्थापित करने के बाद सेवा को HTTP टेक्स्ट भेजा जाएगा।

उदाहरण कनेक्शन टाइमआउट और सॉकेट पढ़ने का टाइमआउट देता है; वे अलग नियंत्रण हैं, एप्लिकेशन सत्र के लिए एक समग्र समय-सीमा नहीं।

CONNECT अनुमति अभी भी प्रॉक्सी की है। सामान्य वेब अनुरोध आगे भेजने वाला एंडपॉइंट सेवा का पोर्ट अस्वीकार कर सकता है या टनल खोलने से पहले प्रमाणीकरण माँग सकता है। उन विफलताओं को ऐसे सर्वर से अलग रखें जो टनल स्वीकार करता है लेकिन बाद में आपके एप्लिकेशन प्रोटोकॉल को अस्वीकार करता है।

यदि उस प्रोटोकॉल को TLS चाहिए, तो कनेक्टेड सॉकेट के माध्यम से सेवा के इच्छित होस्टनाम और सामान्य प्रमाणपत्र जाँच के साथ TLS पर बातचीत करें। केवल CONNECT स्ट्रीम को एन्क्रिप्ट नहीं करता। वास्तविक HTTP API के लिए, HTTP क्लाइंट अधिक सुविधाजनक इंटरफ़ेस बना रहता है क्योंकि वह HTTP संदेशों को भी संभालता है।

संबंधित लेख