لماذا JavaScript في برمجة الشبكات؟
كانت JavaScript في الماضي مجرد لغة لتحريك الأزرار والتحقق من النماذج. أما اليوم فهي أداة قوية جداً لبناء تطبيقات الشبكات. برمجة الشبكات في JavaScript تفتح الأبواب لعالم الوقت الفعلي: الدردشات، الألعاب عبر الإنترنت، بث البيانات، أنظمة المراقبة، وحتى خوادم الويب الخاصة بك.
في هذه المقالة، لن نعيد كتابة الوثائق بطريقة مملة. سننتقل من طلب HTTP بسيط إلى اتصال WebSocket كامل. سترى كيف يحول Node.js لغة المتصفح إلى محرك شبكات قوي. هل أنت مستعد؟ لنبدأ!
الأساسيات: HTTP ووحدات Node.js
أي برمجة شبكات في JavaScript تبدأ بفهم البروتوكولات. الأكثر شيوعاً هو HTTP. في المتصفح، تستخدم fetch() أو XMLHttpRequest، لكن الجانب الخادم يتطلب نهجاً مختلفاً.
إنشاء خادم HTTP بسيط
يوفر Node.js وحدة مدمجة http. إليك مثال بسيط يرد بـ "مرحباً، أيها العالم!" على أي طلب:
const http = require('http');
const server = http.createServer((req, res) => { res.statusCode = 200; res.setHeader('Content-Type', 'text/plain'); res.end('مرحباً، أيها العالم! برمجة الشبكات في JavaScript تعمل!');});
server.listen(3000, '127.0.0.1', () => { console.log('الخادم يعمل على http://127.0.0.1:3000/');});قم بتشغيل هذا الكود عبر node server.js وافتح المتصفح. سترى رسالتنا. بسيط، أليس كذلك؟ لكن هذه مجرد البداية. السحر الحقيقي يبدأ عندما نعمل مع المقابس.
العمل مع مقابس TCP في JavaScript
HTTP هو بروتوكول طبقة تطبيق مبني فوق TCP. إذا كنت بحاجة إلى تحكم كامل في نقل البيانات، استخدم مقابس JavaScript. في Node.js، تتولى ذلك وحدة net.
خادم TCP: استقبال البيانات
تخيل أنك تكتب خادم صدى بسيط. يتصل العميل، يرسل رسالة، ويعيدها الخادم إليه. إليك كيف يبدو ذلك:
const net = require('net');
const server = net.createServer((socket) => { console.log('اتصل العميل');
socket.on('data', (data) => { console.log('تم الاستلام:', data.toString()); socket.write('الصدى: ' + data.toString()); });
socket.on('end', () => { console.log('انفصل العميل'); });});
server.listen(8080, () => { console.log('خادم TCP يستمع على المنفذ 8080');});الآن لنكتب عميلاً لهذا الخادم. خادم-عميل في JavaScript هو حركة ثنائية الاتجاه:
const net = require('net');
const client = net.createConnection({ port: 8080 }, () => { console.log('اتصلنا بالخادم'); client.write('مرحباً أيها الخادم!');});
client.on('data', (data) => { console.log('رد الخادم:', data.toString()); client.end();});
client.on('end', () => { console.log('انفصلنا عن الخادم');});قم بتشغيل الخادم أولاً، ثم العميل. سترى كيف تنتقل البيانات ذهاباً وإياباً. هذا هو أساس جميع بروتوكولات الشبكات في JavaScript.
WebSocket: الوقت الفعلي بدون تأخير
HTTP وTCP جيدان، لكن لديهما مشكلة: للحصول على بيانات جديدة، يجب على العميل إجراء طلبات باستمرار (polling). هذا غير فعال. WebSocket في JavaScript يحل هذه المشكلة - بعد إنشاء الاتصال، يمكن للخادم إرسال البيانات بنفسه في أي لحظة.
WebSocket على Node.js (مكتبة ws)
قم بتثبيت المكتبة: npm install ws
الخادم:
const WebSocket = require('ws');
const wss = new WebSocket.Server({ port: 8081 });
wss.on('connection', (ws) => { console.log('اتصل عميل WebSocket');
ws.on('message', (message) => { console.log('تم الاستلام:',