WebSockets texnologiyasi
WebSockets-ga kirish
WebSockets mijoz va server o‘rtasida doimiy aloqani ta’minlaydi, bu real vaqtda, ikki tomonlama aloqani ta’minlaydi.
Bu so‘rov-javob modeliga amal qiladigan an’anaviy HTTP-dan farq qiladi.
WebSockets-ning asosiy afzalliklari
- Real vaqtda yangilanishlar: ma’lumotlarni darhol mijozlarga uzating
- Samarali: takroriy HTTP so‘rovlariga ehtiyoj yo‘q
- Ikki tomonlama: mijoz ham, server ham xabar yuborishi mumkin
- Kam kechikish: Xabarlar darhol yuboriladi
WebSockets va HTTP
WebSockets va HTTP o‘rtasidagi farqni tushunish real vaqtda ilovalarni samarali yaratish uchun juda muhimdir.
| Xususiyat | WebSockets | HTTP |
|---|---|---|
| Ulanish | Doimiy, yagona ulanish | Har bir so‘rov uchun yangi ulanish |
| Aloqa | Ikki tomonlama, to‘liq dupleks | Bir yo‘nalishli, so‘rov-javob |
| Ustki yuk | Qo‘l siqishdan keyin minimal | Har bir so‘rov bilan sarlavhalar |
| Foydalanish holati | Haqiqiy vaqtda ilovalar | An’anaviy veb-sahifalar, API |
| Misol | Chat ilovalari, jonli tasma | Veb-sahifalarni yuklash, ariza topshirish |
Pro Maslahat: WebSockets WebSocket protokoliga (ws:// yoki wss://) yangilashdan oldin HTTP qo‘l siqish (status kodi 101) bilan boshlanadi.
WebSockets sozlamalari
1. ws modulini o‘rnating
Birinchidan, loyihangiz uchun yangi katalog yarating va uni ishga tushiring:
mkdir websocket-demo
cd websocket-demo
npm init -y
Keyin ws paketini o‘rnating:
npm install ws
Eslatma: ws moduli oddiy, tezkor va har tomonlama sinovdan o‘tgan WebSocket mijozi va server dasturidir.
WebSocket serverini yaratish
Keling, har qanday qabul qilingan xabarni aks ettiruvchi oddiy WebSocket serverini yarataylik.
server.js nomli yangi fayl yarating:
Misol: WebSocket Echo Server
const WebSocket = require('ws');
// Create a WebSocket server on port 8080
const wss = new WebSocket.Server({ port: 8080 });
console.log('WebSocket server is running on ws://localhost:8080');
// Connection event handler
wss.on('connection', (ws) => {
console.log('New client connected');
// Send a welcome message to the client
ws.send('Welcome to the WebSocket server!');
// Message event handler
ws.on('message', (message) => {
console.log(`Received: ${message}`);
// Echo the message back to the client
ws.send(`Server received: ${message}`);
});
// Close event handler
ws.on('close', () => {
console.log('Client disconnected');
});
});
Kodeksni tushunish
- Biz
wsmodulini import qilamiz - 8080 portida yangi WebSocket serverini yarating
- Ulanishlar, xabarlar va uzilishlar uchun hodisa ishlov beruvchilarini sozlang
- Qabul qilingan xabarlarni mijozga qaytaring
Sinab ko‘ring
1. Yuqoridagi kodni server.js sifatida saqlang
2. Serverni ishga tushiring: node server.js
3. Server ws://localhost:8080 da ishga tushadi va tinglaydi
WebSocket mijozini yaratish
Endi bizda WebSocket serveri bor, keling, unga ulanish uchun mijozlar yarataylik. Biz Node.js mijozi va brauzer mijozini yaratamiz.
1. Node.js mijozi
client.js nomli yangi fayl yarating:
const WebSocket = require('ws');
const readline = require('readline');
// Create readline interface for user input
const rl = readline.createInterface({
input: process.stdin,
output: process.stdout
});
// Connect to the WebSocket server
const ws = new WebSocket('ws://localhost:8080');
// Connection opened
ws.on('open', () => {
console.log('Connected to the WebSocket server');
promptForMessage();
});
// Listen for messages from the server
ws.on('message', (message) => {
console.log(`Server: ${message}`);
});
// Handle errors
ws.on('error', (error) => {
console.error('WebSocket error:', error);
});
// Handle connection close
ws.on('close', () => {
console.log('Disconnected from the server');
process.exit(0);
});
// Function to prompt user for messages
function promptForMessage() {
rl.question('Enter a message (or "exit" to quit): ', (message) => {
if (message.toLowerCase() === 'exit') {
ws.close();
rl.close();
return;
}
ws.send(message);
promptForMessage();
});
}
Node.js mijozidan qanday foydalanish kerak
- Yuqoridagi kodni
client.jssifatida saqlang - WebSocket serveri ishlayotganligiga ishonch hosil qiling
- Mijozni ishga tushiring:
node client.js - Xabarlarni kiriting va ularni serverga yuborish uchun Enter tugmasini bosing
- Chiqish uchun "chiqish" ni kiriting
2. Brauzer mijozi
Keling, WebSocket serverimizga ulanish uchun JavaScript bilan oddiy HTML sahifa yarataylik.
index.html nomli fayl yarating:
<!DOCTYPE html>
<html>
<head>
<title>WebSocket Client</title>
<style>
body {
font-family: Arial, sans-serif;
max-width: 600px;
margin: 0 auto;
padding: 20px;
}
#messages {
height: 300px;
border: 1px solid #ccc;
overflow-y: auto;
padding: 10px;
margin-bottom: 10px;
}
.message { margin: 5px 0; }
</style>
</head>
<body>
<h1>WebSocket Client</h1>
<div id="status">Connecting to server...</div>
<div id="messages"></div>
<div>
<input type="text" id="messageInput" placeholder="Type your message">
<button onclick="sendMessage()">Send</button>
</div>
<script>
const status = document.getElementById('status');
const messages = document.getElementById('messages');
const messageInput = document.getElementById('messageInput');
// Connect to the WebSocket server
const ws = new WebSocket('ws://localhost:8080');
// Connection opened
ws.onopen = () => {
status.textContent = 'Connected to server';
status.style.color = 'green';
};
// Listen for messages
ws.onmessage = (event) => {
const message = document.createElement('div');
message.className = 'message';
message.textContent = event.data;
messages.appendChild(message);
messages.scrollTop = messages.scrollHeight;
};
// Handle errors
ws.onerror = (error) => {
status.textContent = 'Error: ' + error.message;
status.style.color = 'red';
};
// Handle connection close
ws.onclose = () => {
status.textContent = 'Disconnected from server';
status.style.color = 'red';
};
// Function to send a message
function sendMessage() {
const message = messageInput.value.trim();
if (message) {
ws.send(message);
messageInput.value = '';
}
}
// Send message on Enter key
messageInput.addEventListener('keypress', (e) => {
if (e.key === 'Enter') {
sendMessage();
}
});
</script>
</body>
</html>
O‘zingiz sinab ko‘ring »
Brauzer mijozidan qanday foydalanish kerak
- Yuqoridagi kodni
index.htmlsifatida saqlang - WebSocket serveri ishlayotganligiga ishonch hosil qiling
- HTML faylni veb-brauzerda oching
- Kirish maydoniga xabarlarni kiriting va Yuborish tugmasini bosing yoki Enter tugmasini bosing
Eslatma: Brauzer mijozi ishlashi uchun brauzer xavfsizligi cheklovlari tufayli HTML faylga veb-server orqali (masalan, http-server yoki live-server) xizmat ko‘rsatishingiz kerak bo‘ladi.
3. Ilovani sinovdan o‘tkazish
- WebSocket serverini ishga tushiring:
node server.js - Mijoz HTML sahifasi bilan bir nechta brauzer oynalarini oching
- Turli mijozlardan xabarlar yuboring va ularning real vaqtda paydo bo‘lishini ko‘ring
- Brauzer mijozlari bilan bir qatorda Node.js mijozini ham ishga tushirishingiz mumkin
Amalga oshirishni tushunish
- Server barcha ulangan mijozlar to‘plamini saqlaydi
- Bitta mijozdan xabar qabul qilinganda, u boshqa barchaga uzatiladi
- Mijoz ulanish, uzilish va xato hodisalarini boshqaradi
- Xabarlar qabul qilingan vaqtda real vaqt rejimida ko‘rsatiladi
WebSocket voqealari
WebSockets voqealarga asoslangan modeldan foydalanadi. Mana asosiy voqealar:
| Tadbir | Tavsif |
|---|---|
connection (server) |
Mijoz serverga ulanganda ishga tushiriladi |
open (client) |
Ulanish o‘rnatilganda ishga tushiriladi |
| message | Xabar qabul qilinganda ishga tushiriladi |
error |
Xatolik yuzaga kelganda ishga tushiriladi |
close |
Ulanish yopilganda ishga tushiriladi |
Haqiqiy dunyo ilovalari
WebSockets turli xil real ilovalarda qo‘llaniladi:
- Chat ilovalari: Tezkor xabarlarni yetkazib berish
- Jonli boshqaruv paneli: Ko‘rsatkichlar va ma’lumotlarning real vaqtda yangilanishi
- Hamkorlik vositalari: Bitta hujjatni bir nechta foydalanuvchi tahrirlaydi
- O‘yinlar: Tez o‘zaro ta’sirlarni talab qiluvchi ko‘p o‘yinchi onlayn o‘yinlar
- Moliyaviy platformalar: Haqiqiy vaqtda birja kotirovkalari va savdo platformalari
- IoT ilovalari: Ulangan qurilmalarni kuzatish va boshqarish
Kengaytirilgan WebSocket xususiyatlari
1. Ikkilik ma’lumotlarni uzatish
WebSockets ma’lum turdagi ma’lumotlar uchun samaraliroq bo‘lgan ikkilik ma’lumotlarni yuborishni qo‘llab-quvvatlaydi:
// Sending binary data (server-side)
const buffer = Buffer.from([0x48, 0x65, 0x6c, 0x6c, 0x6f]); // 'Hello' in binary
ws.send(buffer, { binary: true });
// Receiving binary data (client-side)
ws.binaryType = 'arraybuffer';
ws.onmessage = (event) => {
if (event.data instanceof ArrayBuffer) {
const view = new Uint8Array(event.data);
console.log('Received binary data:', view);
}
};
2. Yurak urishi va ulanish monitoringi
Ajralishlarni aniqlash va boshqarish uchun yurak urishlarini amalga oshiring:
// Server-side heartbeat
function setupHeartbeat(ws) {
ws.isAlive = true;
ws.on('pong', () => { ws.isAlive = true; });
}
// Ping all clients every 30 seconds
const interval = setInterval(() => {
wss.clients.forEach((ws) => {
if (ws.isAlive === false) return ws.terminate();
ws.isAlive = false;
ws.ping();
});
}, 30000);
// Clean up on server close
wss.on('close', () => {
clearInterval(interval);
});
Xavfsizlik masalalari
1. Autentifikatsiya
Har doim WebSocket ulanishlarini autentifikatsiya qiling:
const http = require('http');
const WebSocket = require('ws');
const jwt = require('jsonwebtoken');
const server = http.createServer();
const wss = new WebSocket.Server({ noServer: true });
// Handle upgrade with authentication
server.on('upgrade', (request, socket, head) => {
try {
const token = request.url.split('token=')[1];
if (!token) throw new Error('No token provided');
// Verify JWT token
jwt.verify(token, 'your-secret-key', (err, decoded) => {
if (err) {
socket.write('HTTP/1.1 401 Unauthorized\r\n\r\n');
socket.destroy();
return;
}
// Proceed with WebSocket handshake
wss.handleUpgrade(request, socket, head, (ws) => {
ws.user = decoded; // Attach user data to WebSocket
wss.emit('connection', ws, request);
});
});
} catch (error) {
socket.write('HTTP/1.1 401 Unauthorized\r\n\r\n');
socket.destroy();
}
});
2. Tarifni cheklash
Tarifni cheklash bilan suiiste’mollikning oldini oling:
const rateLimit = require('ws-rate-limit');
// Limit to 100 messages per minute per connection
const limiter = rateLimit({
windowMs: 60 * 1000, // 1 minute
max: 100,
message: 'Too many messages, please slow down!',
});
wss.on('connection', (ws) => {
limiter(ws);
// ... rest of your connection handler
});
3. Kirishni tekshirish
Har doim kiruvchi xabarlarni tasdiqlang:
const Joi = require('joi');
const messageSchema = Joi.object({
type: Joi.string().valid('chat', 'join', 'leave').required(),
username: Joi.string().alphanum().min(3).max(30),
message: Joi.string().max(1000),
room: Joi.string().alphanum().max(50),
});
ws.on('message', (data) => {
try {
const message = JSON.parse(data);
const { error, value } = messageSchema.validate(message);
if (error) {
throw new Error(`Invalid message: ${error.details[0].message}`);
}
// Process valid message...
} catch (err) {
ws.send(JSON.stringify({ error: err.message }));
}
});
Ishlashni optimallashtirish
Siqish
O‘tkazish qobiliyatini kamaytirish uchun har bir xabar deflatsiyasini yoqing:
const WebSocket = require('ws');
const wss = new WebSocket.Server({
port: 8080,
perMessageDeflate: {
zlibDeflateOptions: {
chunkSize: 1024,
memLevel: 7,
level: 3
},
zlibInflateOptions: {
chunkSize: 10 * 1024
},
// Other options
clientNoContextTakeover: true,
serverNoContextTakeover: true,
concurrencyLimit: 10,
}
});
Eng yaxshi amaliyot: Ishlab chiqarish ilovalari uchun WebSockets-ni qo‘llab-quvvatlamaydigan brauzerlar uchun zaxiralar kabi qo‘shimcha funksiyalarni ta’minlaydigan Socket.IO kabi kutubxonalardan foydalanishni ko‘rib chiqing.
W3Schools Pathfinder
Yutuqlaringizni kuzating – bu bepul!
