जावा में वेब-सॉकेट: जब HTTP काफी नहीं है
\n\nएक ऑनलाइन स्टॉक एक्सचेंज की कल्पना करें। आप बिटकॉइन की कीमत का चार्ट देख रहे हैं। हर सेकंड संख्याएँ बदलती हैं। या एक मल्टीप्लेयर गेम, जहाँ आप अपने किरदार को घुमाते हैं, और सौ अन्य खिलाड़ी इसे तुरंत देखते हैं। या बस एक कॉर्पोरेट चैट, जहाँ संदेश F5 दबाए बिना आते हैं।
\n\nयह हुड के नीचे कैसे काम करता है? पहले, डेवलपर्स को तरकीबें अपनानी पड़ती थीं: polling (क्लाइंट हर सेकंड सर्वर से पूछता है "क्या कोई खबर है?"), long polling (सर्वर कनेक्शन तब तक रखता है जब तक कोई खबर न आए), Server-Sent Events (एकतरफा स्ट्रीम)। ये सब अस्थायी समाधान हैं। HTTP प्रोटोकॉल मूल रूप से अनुरोध-प्रतिक्रिया के लिए बनाया गया था। यह स्वयं डेटा को "पुश" नहीं कर सकता।
\n\nयहाँ WebSockets मदद करते हैं। यह एक प्रोटोकॉल है जो एक बार कनेक्शन स्थापित करता है - और इसे खुला रखता है। सर्वर किसी भी समय क्लाइंट को डेटा भेज सकता है, और इसके विपरीत। रीयल-टाइम में द्वि-दिशात्मक संचार, HTTP हेडर के ओवरहेड के बिना।
\n\nइस लेख में, हम जावा में WebSockets को शुरू से अंत तक समझेंगे। हम एक पूर्ण चैट लिखेंगे, छिपी समस्याओं पर चर्चा करेंगे और लोकप्रिय लाइब्रेरीज़ की तुलना करेंगे। यदि आप एक Java डेवलपर हैं और Java में real-time एप्लिकेशन बनाना चाहते हैं - तो आप सही जगह पर हैं।
\n\nWebSocket कैसे काम करता है? संक्षिप्त परिचय
\n\nWebSocket कोई जादू नहीं है, बल्कि TCP के ऊपर एक प्रोटोकॉल है। यह एक सामान्य HTTP अनुरोध (हैंडशेक) के रूप में शुरू होता है, और फिर एक स्थायी द्वि-दिशात्मक चैनल में "अपग्रेड" हो जाता है।
\n\nचरण 1: हैंडशेक
\nक्लाइंट हेडर Upgrade: websocket के साथ एक सामान्य HTTP GET अनुरोध भेजता है। सर्वर कोड 101 Switching Protocols के साथ उत्तर देता है। बस। इस बिंदु से, डेटा HTTP पैकेट के रूप में नहीं, बल्कि WebSocket फ्रेम के रूप में उड़ता है।
चरण 2: डेटा फ्रेम
\nडेटा छोटे पैकेट (फ्रेम) में प्रेषित होता है। फ्रेम टेक्स्ट (सामान्य स्ट्रिंग) या बाइनरी (चित्र, ऑडियो) हो सकता है। Java लाइब्रेरीज़ इस जटिलता को छिपाती हैं - आप बस स्ट्रिंग या बाइट्स के साथ काम करते हैं।
\n\nचरण 3: समापन
\nकोई भी पक्ष एक विशेष Close फ्रेम भेजकर कनेक्शन बंद करने की पहल कर सकता है।
\n\nसरल लगता है? ऐसा ही है। लेकिन शैतान विवरण में है: टाइमआउट, पुनः कनेक्शन, स्केलिंग। लेकिन इस पर बाद में।
\n\nजावा में WebSockets के लिए लाइब्रेरीज़
\n\nJava इकोसिस्टम में तीन मुख्य दृष्टिकोण हैं:
\n\n- \n
- Jakarta WebSocket (JSR 356) — Java EE / Jakarta EE मानक। किसी भी संगत सर्वर (Tomcat, Jetty, GlassFish) पर काम करता है। बहुत सारे एनोटेशन, कम कोड। \n
- Spring WebSocket — Spring इकोसिस्टम में मानक के ऊपर एक परत। Security, STOMP (टॉपिक्स की सदस्यता के लिए WebSocket के ऊपर प्रोटोकॉल) और सुविधाजनक टेम्पलेट्स के साथ एकीकरण प्रदान करता है। \n
- Netty / Vert.x / Undertow — निम्न-स्तरीय एसिंक्रोनस फ्रेमवर्क। अधिकतम प्रदर्शन, लेकिन अधिक कोड। \n
90% कार्यों के लिए Jakarta या Spring पर्याप्त है। हम वास्तविक उदाहरणों के साथ दोनों विकल्पों पर विचार करेंगे।
\n\nउदाहरण 1: Jakarta WebSocket पर सरल चैट (Spring के बिना)
\n\nमान लीजिए, हमारे पास पुराना अच्छा Tomcat 10+ (Jakarta EE) है। हमें एक सर्वर एंडपॉइंट और एक क्लाइंट (HTML+JS) चाहिए।
\n\nसर्वर: एंडपॉइंट क्लास
\nimport jakarta.websocket.*;\nimport jakarta.websocket.server.ServerEndpoint;\nimport java.io.IOException;\nimport java.util.Set;\nimport java.util.concurrent.CopyOnWriteArraySet;\n\n@ServerEndpoint("/chat")\npublic class ChatEndpoint {\n\n // सभी सक्रिय सत्र संग्रहीत करें (थ्रेड-सुरक्षित सेट)\n private static final Set<Session> sessions = new CopyOnWriteArraySet<>();\n\n @OnOpen\n public void onOpen(Session session) {\n sessions.add(session);\n broadcast("उपयोगकर्ता जुड़ गया। चैट में कुल: " + sessions.size());\n }\n\n @OnMessage\n public void onMessage(String message, Session session) {\n // तर्क जोड़ा जा सकता है: केवल भेजें