مكتبة WebSocket لـ Kotlin: ktor-client-websockets
في تطوير الويب الحديث، أصبح تبادل البيانات في الوقت الفعلي مطلوبًا بشكل متزايد: الدردشات عبر الإنترنت، الإشعارات، أسعار البورصة، الألعاب متعددة اللاعبين. بالنسبة لـ Kotlin، واحدة من أقوى المكتبات الأصلية للعمل مع بروتوكول WebSocket هي ktor-client-websockets - وهي جزء من نظام Ktor البيئي (عميل HTTP لـ Kotlin).
في هذه المقالة، سنشرح بالتفصيل كيفية توصيل واستخدام WebSocket في Kotlin باستخدام Ktor. ستتعلم كيفية تثبيت المكتبة، إنشاء اتصال، إرسال واستقبال الرسائل، بالإضافة إلى معالجة الأخطاء وإغلاق الاتصال.
ما هو WebSocket ولماذا هو مطلوب؟
WebSocket هو بروتوكول يوفر اتصالًا ثنائي الاتجاه دائمًا بين العميل (مثل تطبيق Android أو خادم) والخادم. على عكس HTTP، حيث يبدأ العميل الطلب في كل مرة، يسمح WebSocket للخادم بإرسال البيانات إلى العميل فور ظهورها. هذا مثالي لـ:
- الدردشات وتطبيقات المراسلة؛
- الإشعارات وخلاصات الأحداث؛
- الألعاب والمحررات التعاونية؛
- المؤشرات المالية والتداول.
تثبيت مكتبة ktor-client-websockets
للبدء، أضف التبعية إلى ملف build.gradle.kts الخاص بك (مشروع Kotlin/JVM أو Kotlin Multiplatform).
// build.gradle.ktsdependencies { implementation("io.ktor:ktor-client-core:2.3.7") implementation("io.ktor:ktor-client-cio:2.3.7") // أو محرك آخر implementation("io.ktor:ktor-client-websockets:2.3.7")}إذا كنت تستخدم Kotlin Multiplatform، تأكد من إضافة الوحدة لكل منصة (على سبيل المثال، ktor-client-okhttp لنظام Android).
إنشاء عميل WebSocket
الفئة الرئيسية للعمل مع WebSocket هي HttpClient مع المكون الإضافي WebSockets. دعنا نلقي نظرة على مثال بسيط للاتصال بخادم WebSocket.
import io.ktor.client.*import io.ktor.client.plugins.websocket.*import io.ktor.websocket.*
suspend fun main() { val client = HttpClient { install(WebSockets) }
client.webSocket("ws://echo.websocket.org") { // إرسال رسالة send(Frame.Text("مرحبًا، WebSocket!"))
// استقبال الرد for (frame in incoming) { when (frame) { is Frame.Text -> { println("تم الاستلام: ${frame.readText()}") } else -> println("نوع إطار آخر: $frame") } } }
client.close()}في هذا الكود، نقوم بـ:
- إنشاء عميل HTTP مع دعم WebSocket.
- إنشاء اتصال بالخادم الاختباري
ws://echo.websocket.org. - إرسال رسالة نصية.
- قراءة الإطارات الواردة وعرضها في وحدة التحكم.
معالجة الأخطاء وإغلاق الاتصال
في التطبيقات الحقيقية، من المهم معالجة الاستثناءات بشكل صحيح وإغلاق الاتصال. استخدم try-catch و finally.
import io.ktor.client.*import io.ktor.client.plugins.websocket.*import io.ktor.websocket.*import kotlinx.coroutines.*
suspend fun main() = coroutineScope { val client = HttpClient { install(WebSockets) }
try { client.webSocket("ws://your-server.com/ws") { // إرسال send(Frame.Text("بينغ"))
// استقبال مع مهلة زمنية withTimeout(5000) { for (frame in incoming) { if (frame is Frame.Text) { println("الرد: ${frame.readText()}") } } } } } catch (e: Exception) { println("خطأ WebSocket: ${e.message}") } finally { cli