لماذا WebSockets هي سحر الوقت الفعلي؟
\nتخيل أنك فتحت دردشة دعم، وأرسلت رسالة... وتنتظر. ثانية، ثانيتان، خمس ثوانٍ. مألوف؟ هذا هو طلب HTTP التقليدي: أنت تطلب، الخادم يرد. وماذا لو أراد الخادم نفسه أن يقول شيئًا؟ على سبيل المثال، طلب جديد في CRM أو صوت في لعبة عبر الإنترنت؟ هنا يعجز HTTP - فهو يحتاج إلى بينغ بونغ مستمر.
\nWebSockets تحل هذه المشكلة بشكل جذري. فهي تنشئ قناة ثنائية الاتجاه دائمة بين العميل والخادم. "مصافحة" واحدة - وتطير البيانات في كلا الاتجاهين فورًا. لا حركة مرور زائدة، لا تأخير. فقط سحر الوقت الفعلي الخالص.
\nفي هذه المقالة، سنقوم باستخدام TypeScript ببناء تطبيق وقت فعلي كامل. سنتعلم العمل مع خادم WebSocket على Node.js، وسنضبط العميل، وسنضيف حتى معالجة الأخطاء. في النهاية، ستتمكن من كتابة دردشة خاصة بك، أو نظام إشعارات، أو لعبة متعددة اللاعبين.
\n\nما هي WebSockets ولماذا نحتاجها؟
\nWebSocket هو بروتوكول فوق TCP يوفر اتصالاً دائمًا بين المتصفح والخادم. على عكس HTTP، حيث كل طلب يفتح ويغلق اتصالاً، يحافظ WebSocket على الاتصال مفتوحًا.
\nأين يكون هذا ضروريًا؟
\n- \n
- الدردشات وتطبيقات المراسلة - تصل الرسائل دون تأخير. \n
- الألعاب عبر الإنترنت - يتم تحديث مواقع اللاعبين في الوقت الفعلي. \n
- أسعار البورصة - تتغير الأسعار كل ملي ثانية. \n
- التحرير المشترك - مثل Google Docs. \n
يضيف TypeScript إلى ذلك كتابة صارمة. لن ترسل عن طريق الخطأ سلسلة نصية بدلاً من رقم - سيكتشف المترجم الخطأ في مرحلة التطوير. هذا ينقذ من الأخطاء في الإنتاج.
\n\nإعداد المشروع: Node.js + TypeScript + WebSocket
\nلنبدأ بالتهيئة. تأكد من تثبيت Node.js (الإصدار 18+) و npm.
\nmkdir websocket-ts-chat\ncd websocket-ts-chat\nnpm init -y\nnpm install ws @types/ws typescript ts-node @types/node\nnpx tsc --init\nفي tsconfig.json، قم بتفعيل الوضع الصارم وحدد outDir: "./dist". هذا هو الأساس لأي مشروع TypeScript.
كتابة خادم WebSocket باستخدام TypeScript
\nأنشئ ملف server.ts. هنا سنقوم بتشغيل خادم WebSocket على المنفذ 8080.
import { WebSocketServer, WebSocket } from 'ws';\n\nconst wss = new WebSocketServer({ port: 8080 });\n\ninterface CustomWebSocket extends WebSocket {\n id: string;\n username?: string;\n}\n\nwss.on('connection', (ws: CustomWebSocket) => {\n ws.id = generateId();\n console.log(`اتصل العميل: ${ws.id}`);\n\n ws.on('message', (data: Buffer) => {\n const message = data.toString();\n console.log(`تم الاستلام: ${message}`);\n\n // البث للجميع باستثناء المرسل\n wss.clients.forEach((client) => {\n if (client !== ws && client.readyState === WebSocket.OPEN) {\n client.send(`[${ws.id}]: ${message}`);\n }\n });\n });\n\n ws.on('close', () => {\n console.log(`فصل العميل: ${ws.id}`);\n });\n\n ws.send('مرحبًا بك في الدردشة!');\n});\n\nfunction generateId(): string {\n return Math.random().toString(36).substring(2, 9);\n}\n\nconsole.log('تم تشغيل الخادم على ws://localhost:8080');\nدعنا نحلل النقاط الرئيسية:
\n- \n
- WebSocketServer - ينشئ الخادم. \n
- connection - حدث عند اتصال عميل جديد. \n
- message - نستقبل البيانات من العميل. \n
- send - نرسل البيانات مرة أخرى. \n
قم بتشغيل الخادم باستخدام الأمر npx ts-node server.ts. سيقوم بالاستماع على المنفذ 8080.
الجزء العميل: الاتصال بـ WebSocket
\nالآن سننشئ client.ts. سيكون هذا سكريبتًا بسيطًا يتصل بالخادم ويرسل رسالة