WebSocket على Java: تطبيقات الوقت الفعلي من الألف إلى الياء

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

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

ابدأ الدورة

مقدمة: لماذا أصبح WebSocket معيار اتصالات الوقت الفعلي

تتطلب تطبيقات الويب الحديثة استجابة فورية للأحداث. سواء كانت دردشة، أو محطة تداول، أو لعبة متعددة اللاعبين - يتوقع المستخدمون تحديث البيانات دون إعادة تحميل الصفحة. بروتوكول HTTP التقليدي (REST API) بنموذج "الطلب والاستجابة" غير فعال لهذه المهام: يضطر العميل إلى استقصاء الخادم باستمرار (polling)، مما يخلق حملاً زائداً وتأخيراً.

حل هذه المشكلة هو بروتوكول WebSocket، الذي ينشئ اتصالاً ثنائي الاتجاه دائماً بين العميل والخادم. في هذه المقالة، سنشرح WebSocket على Java من الأساسيات حتى إنشاء تطبيق وقت فعلي كامل. ستتعلم كيفية إعداد الخادم، كتابة العميل، ومعالجة الأخطاء.



أساسيات WebSocket: كيف يعمل

الفرق عن HTTP

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

المزايا الرئيسية:

  • زمن وصول منخفض - تُنقل البيانات فوراً دون مصافحات متكررة.
  • حركة مرور أقل - رأس بيانات ضئيل (2-14 بايت فقط) مقابل مئات البايتات في HTTP.
  • ثنائية الاتجاه - يمكن لكل من العميل والخادم بدء إرسال البيانات.


هندسة تطبيق الوقت الفعلي على Java

يتكون التطبيق النموذجي من ثلاثة مكونات:

  1. العميل (متصفح أو تطبيق جوال) الذي يبدأ الاتصال.
  2. خادم التطبيقات (Java) الذي يدير جلسات WebSocket.
  3. النظام الخلفي (قاعدة بيانات، قوائم انتظار الرسائل) الذي يعالج منطق الأعمال.

توفر Java أدوات قوية للعمل مع WebSocket - سواء على جانب الخادم (Jakarta WebSocket، Spring WebSocket) أو على جانب العميل (واجهة برمجة تطبيقات Java WebSocket القياسية).



إنشاء خادم WebSocket على Java

تحضير البيئة

بالنسبة للجزء الخادم، سنستخدم Jakarta WebSocket (المعروف سابقاً باسم Java EE WebSocket). هذه واجهة برمجة تطبيقات قياسية مضمنة في Jakarta EE. ستحتاج إلى:

  • JDK 11 أو أعلى.
  • خادم تطبيقات (مثل Apache Tomcat 10 أو GlassFish 7).
  • Maven لإدارة التبعيات.

أضف التبعية التالية إلى pom.xml:

<dependency>    <groupId>jakarta.websocket</groupId>    <artifactId>jakarta.websocket-api</artifactId>    <version>2.1.0</version>    <scope>provided</scope></dependency>


كتابة نقطة نهاية WebSocket

لننشئ خادم صدى بسيطاً يعيد إرسال الرسالة المستلمة:

import jakarta.websocket.*;import jakarta.websocket.server.ServerEndpoint;

@ServerEndpoint("/chat")public class ChatEndpoint {

@OnOpen public void onOpen(Session session) { System.out.println("اتصال جديد: " + session.getId()); }

@OnMessage public String onMessage(String message, Session session) { System.out.println("تم الاستلام من " + session.getId() + ": " + message); return "صدى: " + message; }

@OnClose public void onClose(Session session, CloseReason reason) { System.out.println("تم إغلاق الاتصال: " + session.getId() + " بسبب: " + reason.getReasonPhrase()); }

@OnError public void onError(Session session, Throwable error) { System.err.println("خطأ في الجلسة " + session.getId() + ": " + error.getMessage()); }}

التعليمة @ServerEndpoint("/chat")

المدونات

توصيات الكتب