logo
eng-flag

WebSocket Notları ve İpuçları

İçindekiler

  1. WebSocket'lere Giriş
  2. WebSocket El Sıkışması
  3. WebSocket Protokolü
  4. WebSocket API'si
  5. Sunucu Tarafı Uygulaması
  6. İstemci Tarafı Uygulaması
  7. WebSocket Olayları
  8. WebSocket Metodları
  9. WebSocket Durumları
  10. Hata İşleme
  11. Güvenlik Hususları
  12. WebSocket'leri Ölçeklendirme
  13. En İyi Uygulamalar
  14. Araçlar ve Kütüphaneler

WebSocket'lere Giriş

WebSocket, bir istemci ve sunucu arasında tek bir TCP bağlantısı üzerinden tam çift yönlü, iki yönlü iletişimi sağlayan bir protokoldür. Sohbet sistemleri, canlı güncellemeler ve oyun gibi gerçek zamanlı, olay tabanlı uygulamalar için tasarlanmıştır.

WebSocket El Sıkışması

WebSocket bağlantısı, bir HTTP yükseltme isteği ile başlar:

GET /chat HTTP/1.1
Host: server.example.com
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==
Origin: http://example.com
Sec-WebSocket-Protocol: chat, superchat
Sec-WebSocket-Version: 13

Sunucu yanıtı:

HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept: s3pPLMBiTxaQ9kYGzzhZRbK+xOo=
Sec-WebSocket-Protocol: chat

WebSocket Protokolü

  • ws:// veya wss:// (güvenli WebSocket için) URL şemasını kullanır
  • Metin ve ikili veri çerçevelerini destekler
  • Bağlantıları canlı tutmak için bir ping/pong mekanizması içerir

WebSocket API'si

WebSocket API'si, WebSocket bağlantılarını oluşturmak ve yönetmek için basit bir arayüz sağlar.

const socket = new WebSocket('ws://example.com/socketserver');

Sunucu Tarafı Uygulaması

Node.js ve ws kütüphanesi kullanarak örnek:

const WebSocket = require('ws');
const wss = new WebSocket.Server({ port: 8080 });

wss.on('connection', function connection(ws) {
 ws.on('message', function incoming(message) {
   console.log('alındı: %s', message);
 });

 ws.send('WebSocket sunucusuna hoş geldiniz!');
});

İstemci Tarafı Uygulaması

const socket = new WebSocket('ws://localhost:8080');

socket.addEventListener('open', function (event) {
   socket.send('Merhaba Sunucu!');
});

socket.addEventListener('message', function (event) {
   console.log('Sunucudan gelen mesaj:', event.data);
});

WebSocket Olayları

  1. open: Bağlantı kurulduğunda tetiklenir
  2. message: Veri alındığında tetiklenir
  3. error: Bir hata oluştuğunda tetiklenir
  4. close: Bağlantı kapatıldığında tetiklenir
socket.addEventListener('open', (event) => {
   console.log('WebSocket bağlantısı açıldı');
});

socket.addEventListener('message', (event) => {
   console.log('Alınan mesaj:', event.data);
});

socket.addEventListener('error', (event) => {
   console.error('WebSocket hatası:', event);
});

socket.addEventListener('close', (event) => {
   console.log('WebSocket bağlantısı kapandı');
});

WebSocket Metodları

  1. send(): WebSocket bağlantısı üzerinden veri gönderir
  2. close(): WebSocket bağlantısını kapatır
// Veri gönderme
socket.send('Merhaba, sunucu!');

// Bağlantıyı kapatma
socket.close();

WebSocket Durumları

readyState özelliği, WebSocket bağlantısının durumunu gösterir:

  • WebSocket.CONNECTING (0): Bağlantı henüz açık değil
  • WebSocket.OPEN (1): Bağlantı açık ve iletişime hazır
  • WebSocket.CLOSING (2): Bağlantı kapatılma sürecinde
  • WebSocket.CLOSED (3): Bağlantı kapalı veya açılamadı
if (socket.readyState === WebSocket.OPEN) {
   socket.send('Veri');
}

Hata İşleme

socket.addEventListener('error', (error) => {
   console.error('WebSocket Hatası:', error);
});

// Belirli hataları işleme
socket.addEventListener('close', (event) => {
   if (event.code === 1006) {
       console.error('Bağlantı anormal şekilde kapandı');
   }
});

Güvenlik Hususları

  1. Şifrelenmiş bağlantılar için WSS (WebSocket Secure) kullanın
  2. Tüm gelen mesajları doğrulayın ve temizleyin
  3. Uygun kimlik doğrulama ve yetkilendirme uygulayın
  4. Siteler arası WebSocket ele geçirmeye (CSWSH) karşı koruma sağlayın
  5. Uygun zaman aşımları ayarlayın ve yeniden bağlanma stratejileri uygulayın
const socket = new WebSocket('wss://secure.example.com');

WebSocket'leri Ölçeklendirme

  1. WebSocket desteği olan bir yük dengeleyici kullanın
  2. Mesajları birden çok sunucu örneği arasında dağıtmak için bir yayın/abone sistemi (örn. Redis) uygulayın
  3. WebSocket kümeleme çözümlerini düşünün
  4. Mesaj boyutunu ve sıklığını optimize edin
  5. Uygun bağlantı yönetimi ve temizliği uygulayın

En İyi Uygulamalar

  1. Bağlantıları canlı tutmak için kalp atışı mekanizması kullanın
  2. İstemci tarafında yeniden bağlanma mantığı uygulayın
  3. Bağlantı hatalarını ve zaman aşımlarını düzgün bir şekilde ele alın
  4. Büyük yükler için veya performans kritik olduğunda ikili veri kullanın
  5. Uygun hata işleme ve günlük kaydı uygulayın
  6. Belirli iletişim kalıplarını tanımlamak için alt protokoller kullanın
  7. Mobil cihazlar için optimize edin (pil ömrü ve veri kullanımını göz önünde bulundurun)
  8. Kötüye kullanımı önlemek için hız sınırlaması uygulayın
  9. Büyük metin yükleri için sıkıştırma kullanın
  10. Artık gerekli olmadığında WebSocket bağlantılarını düzgün bir şekilde kapatın

Örnek kalp atışı uygulaması:

// İstemci tarafı
function heartbeat() {
   if (socket.readyState === WebSocket.OPEN) {
       socket.send('__ping__');
       setTimeout(heartbeat, 30000);
   }
}

socket.addEventListener('open', heartbeat);

socket.addEventListener('message', (event) => {
   if (event.data === '__pong__') {
       console.log('Pong alındı');
   } else {
       console.log('Alındı:', event.data);
   }
});

// Sunucu tarafı
wss.on('connection', (ws) => {
   ws.isAlive = true;
   ws.on('pong', () => {
       ws.isAlive = true;
   });
   ws.on('message', (message) => {
       if (message === '__ping__') {
           ws.send('__pong__');
       }
   });
});

setInterval(() => {
   wss.clients.forEach((ws) => {
       if (!ws.isAlive) return ws.terminate();
       ws.isAlive = false;
       ws.ping();
   });
}, 30000);

Araçlar ve Kütüphaneler

  1. Socket.IO: Gerçek zamanlı çift yönlü olay tabanlı iletişim sağlar
  2. ws: Node.js için basit bir WebSocket istemcisi ve sunucusu uygulaması
  3. WebSocket-Node: Node.js'de WebSocket istemcisi ve sunucusu uygulaması
  4. SockJS: JavaScript için WebSocket benzeri bir nesne sağlar
  5. Pusher: Barındırılan WebSocket altyapısı
  6. SignalR: Gerçek zamanlı ASP.NET kütüphanesi (WebSocket'leri destekler)
  7. websockets: Python için WebSocket istemci ve sunucu kütüphanesi
  8. Gorilla WebSocket: Go için WebSocket uygulaması
  9. Faye: Web ve Node.js uygulamaları için basit yayın/abone mesajlaşması
  10. µWebSockets: C++ dilinde yüksek ölçeklenebilir WebSocket sunucusu ve istemci uygulaması

2024 © Tüm hakları saklıdır - buraxta.com