أحداث مرسلة من الخادم في Java: عندما يكون WebSocket مبالغًا فيه و HTTP غير كافٍ
\n\nهل تساءلت يومًا كيف تعمل خلاصات الأخبار في Twitter، أو إشعارات Telegram، أو النتائج المباشرة للمباريات الرياضية؟ يبدو أن البيانات تأتي من تلقاء نفسها، دون تحديث الصفحة. السر بسيط: أحداث مرسلة من الخادم (SSE) — تقنية تسمح للخادم بإرسال البيانات إلى العميل في الوقت الفعلي عبر اتصال HTTP عادي.
\n\nفي هذه المقالة، سنشرح أحداث مرسلة من الخادم في Java. ستتعرف على لماذا غالبًا ما تكون SSE أكثر ملاءمة من WebSocket، وكيفية إعداد خادم باستخدام Java Servlet API، وكيفية استقبال الأحداث على العميل. سيكون الكود عمليًا، والأسلوب حيويًا، والأمثلة قريبة قدر الإمكان من المهام الحقيقية.
\n\nما هي أحداث مرسلة من الخادم ولماذا نحتاجها؟
\n\nأحداث مرسلة من الخادم (SSE) هي معيار W3C يسمح للخادم بـ "دفع" البيانات إلى العميل عبر اتصال HTTP واحد طويل العمر. يشترك العميل في تدفق الأحداث، ويرسل الخادم الرسائل عند ظهورها.
\n\nSSE مثالية لـ:
\n- \n
- الإشعارات — رسائل بريد إلكتروني جديدة، رسائل، تغييرات في الحالة. \n
- خلاصات الأخبار — منشورات، تغريدات، أسعار العملات. \n
- المراقبة — السجلات، مقاييس الخادم، تقدم المهام. \n
- البيانات المباشرة — أسعار الأسهم، نتائج المباريات، الطقس. \n
على عكس WebSocket، تعمل SSE في اتجاه واحد فقط (خادم ← عميل)، لكن هذا يكفي لمعظم السيناريوهات. بالإضافة إلى ذلك، تستخدم SSE HTTP العادي، ولا تتطلب منافذ إضافية، وتمر بسهولة عبر البروكسيات وجدران الحماية.
\n\nأحداث مرسلة من الخادم مقابل WebSocket: ماذا تختار؟
\n\nإذا كنت تحتاج فقط إلى إرسال البيانات من الخادم إلى العميل (بدون ردود فعل)، فاختر SSE. إنها أبسط وأخف وأرخص. يكون WebSocket مبررًا عندما يرسل العميل أيضًا بيانات بنشاط (على سبيل المثال، في الدردشات أو الألعاب عبر الإنترنت).
\n\n| المعيار | \nأحداث مرسلة من الخادم | \nWebSocket | \n
|---|---|---|
| الاتجاه | \nخادم ← عميل | \nثنائي الاتجاه | \n
| البروتوكول | \nHTTP/1.1, HTTP/2 | \nws:// أو wss:// | \n
| إعادة الاتصال التلقائي | \nنعم (مدمج في المتصفح) | \nلا (يحتاج إلى تنفيذ) | \n
| صعوبة التنفيذ | \nمنخفضة | \nمتوسطة/عالية | \n
| دعم المتصفحات | \nجميع المتصفحات الحديثة | \nجميع المتصفحات الحديثة | \n
بالنسبة لموقع PythonLib التعليمي، اخترنا Java لأنها لغة موثوقة لتطوير الخادم. هيا بنا!
\n\nجزء الخادم: تنفيذ SSE في Java باستخدام Servlet API
\n\nلنبدأ بالخادم. الطريقة الأسهل هي استخدام Java Servlets القياسية. نحتاج إلى:
\n- \n
- تعيين الرأس
Content-Type: text/event-stream. \n - تعطيل التخزين المؤقت (
Cache-Control: no-cache). \n - إبقاء الاتصال مفتوحًا. \n
- إرسال البيانات بتنسيق
data: ...\\n\\n. \n
مثال 1: خادم SSE بسيط باستخدام Java Servlet
\n\nلننشئ سيرفلت يرسل الوقت الحالي كل 5 ثوانٍ.
\n\nimport javax.servlet.ServletException;\nimport javax.servlet.annotation.WebServlet;\nimport javax.servlet.http.HttpServlet;\nimport javax.servlet.http.HttpServletRequest;\nimport javax.servlet.http.HttpServletResponse;\nimport java.io.IOException;\nimport java.io.PrintWriter;\nimport java.time.LocalTime;\nimport java.util.concurrent.Executors;\nimport java.util.concurrent.ScheduledExecutorServ