أحداث مرسلة من الخادم في Java: كيفية إرسال البيانات في الوقت الفعلي بدون WebSocket

مدرب بايثون أونلاين للمبتدئين

تعلم Python بسهولة دون إرهاق نظري. حل مهام عملية مع التحقق التلقائي واكتب الكود مباشرة في المتصفح.

ابدأ الدورة

أحداث مرسلة من الخادم في 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\n

SSE مثالية لـ:

\n
    \n
  • الإشعارات — رسائل بريد إلكتروني جديدة، رسائل، تغييرات في الحالة.
  • \n
  • خلاصات الأخبار — منشورات، تغريدات، أسعار العملات.
  • \n
  • المراقبة — السجلات، مقاييس الخادم، تقدم المهام.
  • \n
  • البيانات المباشرة — أسعار الأسهم، نتائج المباريات، الطقس.
  • \n
\n\n

على عكس WebSocket، تعمل SSE في اتجاه واحد فقط (خادم ← عميل)، لكن هذا يكفي لمعظم السيناريوهات. بالإضافة إلى ذلك، تستخدم SSE HTTP العادي، ولا تتطلب منافذ إضافية، وتمر بسهولة عبر البروكسيات وجدران الحماية.

\n\n

أحداث مرسلة من الخادم مقابل WebSocket: ماذا تختار؟

\n\n

إذا كنت تحتاج فقط إلى إرسال البيانات من الخادم إلى العميل (بدون ردود فعل)، فاختر SSE. إنها أبسط وأخف وأرخص. يكون WebSocket مبررًا عندما يرسل العميل أيضًا بيانات بنشاط (على سبيل المثال، في الدردشات أو الألعاب عبر الإنترنت).

\n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
المعيارأحداث مرسلة من الخادمWebSocket
الاتجاهخادم ← عميلثنائي الاتجاه
البروتوكولHTTP/1.1, HTTP/2ws:// أو wss://
إعادة الاتصال التلقائينعم (مدمج في المتصفح)لا (يحتاج إلى تنفيذ)
صعوبة التنفيذمنخفضةمتوسطة/عالية
دعم المتصفحاتجميع المتصفحات الحديثةجميع المتصفحات الحديثة
\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
\n\n

مثال 1: خادم SSE بسيط باستخدام Java Servlet

\n\n

لننشئ سيرفلت يرسل الوقت الحالي كل 5 ثوانٍ.

\n\n
import 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                

المدونات

توصيات الكتب