सामान्य HTTP-अनुरोध डाक से पत्र भेजने जैसा है, जबकि SSE रियल-टाइम में टेलीग्राम है
\n\nकल्पना करें: आप वेबसाइट पर एक नई टिप्पणी के बारे में सूचना की प्रतीक्षा कर रहे हैं। आप हर 5 सेकंड में पेज रिफ्रेश करते हैं। सर्वर हर बार ढेर सारा HTML, CSS, चित्र लौटाता है - और उसके बाद ही, सबसे नीचे, आप देखते हैं: "कोई नई टिप्पणी नहीं"। परिचित लगता है? इसे polling कहते हैं। यह काम करता है, लेकिन ट्रैफिक खाता है और सर्वर को लोड करता है।
\n\nअब एक और परिदृश्य की कल्पना करें: आपने एक पेज खोला, और एक सेकंड बाद उस पर एक संदेश दिखाई देता है: "वसीली ने टिप्पणी छोड़ी: "बढ़िया लेख!"। बिना रीलोड किए, बिना अतिरिक्त अनुरोधों के। सर्वर स्वयं आपको डेटा "पुश" करता है। यही है सर्वर-सेंट इवेंट्स (SSE) - एक तकनीक जो सर्वर को सामान्य HTTP कनेक्शन के माध्यम से क्लाइंट को इवेंट्स की एक स्ट्रीम भेजने की अनुमति देती है।
\n\nइस लेख में, हम जानेंगे कि भारी फ्रेमवर्क का उपयोग किए बिना शुद्ध C++ पर SSE कैसे लागू करें। आप जानेंगे कि C++ में सर्वर-सेंट इवेंट्स मॉनिटरिंग, स्टॉक कोट्स, चैट सूचनाओं और किसी भी ऐसे कार्य के लिए एक उत्कृष्ट विकल्प क्यों है जहां रियल-टाइम में एकतरफा डेटा ट्रांसफर की आवश्यकता होती है।
\n\nसर्वर-सेंट इवेंट्स कैसे काम करते हैं? प्रोटोकॉल का विश्लेषण
\n\nSSE HTML5 विनिर्देश का हिस्सा है। क्लाइंट एक सामान्य HTTP कनेक्शन खोलता है और सर्वर से कहता है: "मैं इवेंट सुनने के लिए तैयार हूं"। सर्वर जवाब में कनेक्शन बंद नहीं करता, बल्कि विशेष text/event-stream प्रारूप में डेटा भेजना शुरू करता है।
संदेश का प्रारूप अत्यंत सरल है:
\n\ndata: यह इवेंट का टेक्स्ट है\\n\\n\n\nप्रत्येक इवेंट data: से शुरू होता है और डबल न्यूलाइन के साथ समाप्त होता है। पहचान के लिए id:, इवेंट प्रकार के लिए event: और मिलीसेकंड में पुनः कनेक्शन समय निर्दिष्ट करने के लिए retry: जोड़ा जा सकता है।
पूर्ण स्ट्रीम का उदाहरण:
\n\nid: 42\nevent: new_message\ndata: {"user": "वसीली", "text": "नमस्ते!"}\n\nid: 43\nevent: ping\ndata: सर्वर जीवित है\n\n\n\nक्लाइंट (ब्राउज़र या कोई भी एप्लिकेशन) इन पंक्तियों को संसाधित करता है और JavaScript इवेंट उत्पन्न करता है। सब कुछ सरल है।
\n\nSSE बनाम WebSocket: कब क्या चुनें?
\n\nजब रियल-टाइम की बात आती है तो कई लोग तुरंत WebSocket के बारे में सोचते हैं। आइए तुलना करें:
\n\n- \n
- WebSocket - द्विदिश संचार। क्लाइंट और सर्वर दोनों आदान-प्रदान शुरू कर सकते हैं। एक अलग प्रोटोकॉल (ws://) की आवश्यकता होती है, प्रॉक्सी से गुजरना पड़ता है, अक्सर कॉर्पोरेट फायरवॉल द्वारा अवरुद्ध किया जाता है। \n
- SSE - एकतरफा संचार (सर्वर → क्लाइंट)। सामान्य HTTP पर काम करता है। डिस्कनेक्ट होने पर स्वचालित रूप से पुनः कनेक्ट होता है। किसी भी प्रॉक्सी से आसानी से गुजरता है। \n
यदि आपका कार्य क्लाइंट को सूचनाएं भेजना है, न कि उससे कमांड की प्रतीक्षा करना, तो C++ पर सर्वर-सेंट इवेंट्स एक सुरुचिपूर्ण और सरल समाधान है। भारी लाइब्रेरी लाने की आवश्यकता नहीं, जटिल हैंडलर लिखने की आवश्यकता नहीं।
\n\nस्क्रैच से C++ में SSE सर्वर लिखना
\n\nकार्यान्वयन के लिए हमें न्यूनतम चाहिए: सॉकेट और HTTP के साथ काम करना। वास्तविक प्रोजेक्ट्स में Boost.Beast या libmicrohttpd का उपयोग किया जाता है, लेकिन सार को समझने के लिए हम POSIX सॉकेट का उपयोग करके शुद्ध C++ में एक सरल सर्वर लिखेंगे।
\n\nहमारा सर्वर होगा:
\n- \n
- क्लाइंट से HTTP अनुरोध स्वीकार करना \n
- यह निर्धारित करना कि क्लाइंट SSE चाहता है (हेडर
Accept: text/event-streamद्वारा) - हर 2 सेकंड में वर्तमान समय के साथ इवेंट्स की एक स्ट्रीम भेजना
चरण 1: सॉकेट बनाएं और पोर्ट पर सुनें
\n\n#include <iostream>\n#include <string>\n#include <cstring>\n#include <unistd.h>\n#include <arpa/inet.h>\n#include <sys/socket.h>\n#include <thread>\n#include <chrono>\n#include <sstream>\n\nvoid handle_client(int client_socket) {\n // अनुरोध के लिए बफर\n char buffer[4096] = {0};\n read(client_socket, buffer, 4096);\n \n // जांचें कि यह GE है