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

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

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

ابدأ الدورة

مقدمة إلى WebSocket في Java: من النظرية إلى تطبيقات الوقت الفعلي

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



ما هو WebSocket ولماذا Java؟

WebSocket هو بروتوكول يعمل فوق TCP، ويسمح بتبادل الرسائل في الوقت الفعلي دون الحاجة إلى overhead لرؤوس HTTP. بعد المصافحة (الترقية من HTTP إلى WebSocket)، يمكن للخادم والعميل إرسال البيانات لبعضهما البعض في أي وقت. Java هي خيار ممتاز لتنفيذ WebSocket بفضل:

  • الدعم المدمج في Jakarta EE (سابقاً Java EE) من خلال JSR 356.
  • الأداء العالي وتعدد المهام.
  • النظام البيئي للأطر (Spring, Netty, Tyrus) التي تبسط التطوير.

على عكس polling و SSE (Server-Sent Events)، يوفر WebSocket اتصالاً ثنائي الاتجاه كاملاً دون تأخير.



هندسة تطبيق WebSocket في Java

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

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

سننظر في تنفيذ الخادم باستخدام تعليقات Jakarta WebSocket التوضيحية وعميل JavaScript.



الجزء الخادم: التعليقات التوضيحية @ServerEndpoint

لإنشاء خادم، يكفي إضافة التبعية jakarta.websocket-api (أو javax.websocket-api للإصدارات القديمة). مثال على خادم echo بسيط:

import jakarta.websocket.*;import jakarta.websocket.server.ServerEndpoint;import java.io.IOException;

@ServerEndpoint("/echo")public class EchoEndpoint {

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

@OnMessage public void onMessage(String message, Session session) throws IOException { System.out.println("تم الاستلام: " + message); // إرسال الرد (echo) session.getBasicRemote().sendText("Echo: " + message); }

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

@OnError public void onError(Session session, Throwable error) { error.printStackTrace(); }}

يتم نشر الخادم في أي حاوية Servlet (Tomcat, Jetty, GlassFish). بالنسبة لـ Spring Boot، استخدم @ServerEndpoint مع SpringBootApplication.



الجزء العميل: JavaScript

يتصل عميل المتصفح عبر WebSocket API القياسي:

const socket = new WebSocket("ws://localhost:8080/echo");

socket.onopen = function(event) { console.log("تم إنشاء الاتصال"); socket.send("مرحباً أيها الخادم!");};

socket.onmessage = function(event) { console.log("رسالة من الخادم: " + event.data);};

socket.onclose = function(event) { console.log("تم إغلاق الاتصال");};

لاحظ: يبدأ عنوان URL بـ ws:// (أو wss:// للاتصال الآمن).



إنشاء دردشة فورية في Java

الآن سنبني كاملاً

المدونات

توصيات الكتب