WebSockets في Kotlin: من النظرية إلى سحر الوقت الفعلي
تخيل أنك فتحت تطبيق مراسلة، وأرسلت رسالة - وظهرت فورًا لدى الشخص الآخر. دون إعادة تحميل الصفحة، ودون طلبات مستمرة للخادم. هذا ليس سحرًا، إنها WebSockets في Kotlin. إذا كنت ترغب يومًا في إنشاء دردشة خاصة بك، أو نظام إشعارات في الوقت الفعلي، أو لعبة متعددة اللاعبين - فأنت في المكان الصحيح.
في هذه المقالة، سنشرح كيفية عمل WebSockets، ونكتب تطبيق وقت فعلي كامل بلغة Kotlin باستخدام Ktor، وسأعرض لك كودًا يمكنك تشغيله فورًا. هيا بنا!
ما هي WebSockets ولماذا نحتاجها في Kotlin؟
WebSocket هو بروتوكول اتصال ثنائي الاتجاه بين العميل والخادم عبر اتصال TCP واحد. على عكس HTTP التقليدي، حيث يبدأ العميل دائمًا الطلب، يسمح WebSocket للخادم بإرسال البيانات إلى العميل في أي وقت.
ما الذي يجعل WebSocket أفضل من HTTP؟
- السرعة الفورية: يتم تسليم البيانات في أجزاء من الثانية
- توفير حركة المرور: لا توجد رؤوس زائدة كما في HTTP
- ثنائية الاتجاه: يمكن للخادم بدء الإرسال
- اتصال دائم: لا حاجة لإعادة الاتصال في كل مرة
لغة Kotlin مع coroutines وإطار العمل Ktor مثالية للعمل مع WebSockets. البرمجة غير المتزامنة، والخفة، والتركيب النحوي المعبّر - هذا ما يجعل تطوير WebSocket باستخدام Kotlin ممتعًا للغاية.
متى نستخدم WebSockets؟
إليك بعض السيناريوهات حيث ستكون تطبيقات الوقت الفعلي بلغة Kotlin مع WebSockets لا غنى عنها:
- الدردشات وتطبيقات المراسلة - نقل الرسائل في الوقت الفعلي
- أنظمة الإشعارات - التنبيهات، النوافذ المنبثقة، تحديثات الحالة
- الألعاب عبر الإنترنت - مزامنة اللاعبين
- أسعار البورصة - تحديث الأسعار دون إعادة تحميل
- التحرير المشترك - وظائف مشابهة لـ Google Docs
إعداد المشروع: Ktor + WebSockets
لإنشاء خادم WebSocket بلغة Kotlin سنستخدم Ktor - إطار عمل غير متزامن حديث من JetBrains. دعنا نجهز المشروع.
الخطوة 1: إضافة التبعيات
إذا كنت تستخدم Gradle (وأنا متأكد من أنك تستخدمه)، أضف إلى build.gradle.kts:
dependencies { implementation("io.ktor:ktor-server-core:2.3.7") implementation("io.ktor:ktor-server-netty:2.3.7") implementation("io.ktor:ktor-server-websockets:2.3.7") implementation("ch.qos.logback:logback-classic:1.4.14")}الخطوة 2: إنشاء خادم WebSocket
الآن سنكتب الخادم نفسه. سيقبل الاتصالات ويبث الرسائل لجميع العملاء المتصلين - المنطق الأساسي للدردشة.
import io.ktor.server.engine.*import io.ktor.server.netty.*import io.ktor.server.websocket.*import io.ktor.websocket.*import kotlinx.coroutines.channels.Channelimport kotlinx.coroutines.launch
fun main() { val clients = mutableSetOf<WebSocketSession>()
embeddedServer(Netty, port = 8080) { install(WebSockets) { pingPeriod = 15_000 // 15 ثانية timeout = 15_000 maxFrameSize = Long.MAX_VALUE }
routing { webSocket("/chat") { // إضافة العميل clients.add(this) println("اتصال جديد: $this")
try { for (frame in incoming) { if (frame is Frame.Text) { val message = frame.readText() println("تم الاستلام: $message")
// إرسال لجميع العملاء