Ana içeriğe geç

Socket Örneği (istemci tarafı)

Bir Socket, sunucu ile etkileşimde bulunmak için temel sınıftır. Node.js EventEmitter sınıfının emit, on, once veya off gibi çoğu yöntemini miras alır.

Emitting ve listening to olaylarının yanı sıra, Socket örneği uygulamanızda kullanışlı olabilecek birkaç niteliğe sahiptir:

Socket#id

Her yeni bağlantı, rastgele 20 karakterden oluşan bir tanımlayıcıya atanır.

Bu tanımlayıcı, sunucu tarafındaki değerle senkronize edilir.

// sunucu tarafı
io.on("connection", (socket) => {
console.log(socket.id); // x8WIv7-mJelg7on_ALbx
});

// istemci tarafı
socket.on("connect", () => {
console.log(socket.id); // x8WIv7-mJelg7on_ALbx
});

socket.on("disconnect", () => {
console.log(socket.id); // undefined
});
uyarı

Lütfen, bağlantı durumu kurtarma etkinleştirilmemişse, id niteliğinin geçici bir ID olduğunu ve uygulamanızda kullanılmaması gerektiğini (yalnızca hata ayıklama amacıyla) dikkate alınız:

  • Bu ID, her yeniden bağlantıda (örneğin, WebSocket bağlantısı kesildiğinde veya kullanıcı sayfayı yenilediğinde) yeniden oluşturulur.
  • İki farklı tarayıcı sekmesi, iki farklı ID'ye sahip olacaktır.
  • Sunucuda, belirli bir ID için saklanan bir mesaj kuyruğu yoktur (yani, istemci kesildiğinde, bu ID'ye gönderilen mesajlar kaybolur).

Bunun yerine, bir oturum ID'si kullanınız (ya bir çerez içinde gönderilir, ya da localStorage içinde saklanır ve auth yükü içinde gönderilir).

Ayrıca bakınız:

  • Özel mesaj kılavuzumuzun II. Bölümü
  • Çerezlerle nasıl başa çıkılır

Socket#connected

Bu nitelik, soketin şu anda sunucuya bağlı olup olmadığını tanımlar.

socket.on("connect", () => {
console.log(socket.connected); // true
});

socket.on("disconnect", () => {
console.log(socket.connected); // false
});

Socket#io

Altındaki Manager referansı.

socket.on("connect", () => {
const engine = socket.io.engine;
console.log(engine.transport.name); // çoğu durumda, "polling" yazar

engine.once("upgrade", () => {
// taşıma yükseltildiğinde çağrılır (yani HTTP uzun-polling'den WebSocket'e)
console.log(engine.transport.name); // çoğu durumda, "websocket" yazar
});

engine.on("packet", ({ type, data }) => {
// alınan her paket için çağrılır
});

engine.on("packetCreate", ({ type, data }) => {
// gönderilen her paket için çağrılır
});

engine.on("drain", () => {
// yazma tamponu boşaltıldığında çağrılır
});

engine.on("close", (reason) => {
// altındaki bağlantı kapandığında çağrılır
});
});

Yaşam Döngüsü

Olaylar

Socket örneği üç özel olay yayar:

  • connect
  • connect_error
  • disconnect
ipucu

Socket.IO v3'ten itibaren, Socket örneği yeniden bağlantı mantığı ile ilgili hiçbir olayı artık yaymaz. Olayları doğrudan Manager örneğinde dinleyebilirsiniz:

socket.io.on("reconnect_attempt", () => {
// ...
});

socket.io.on("reconnect", () => {
// ...
});

Daha fazla bilgi için göç kılavuzuna bakabilirsiniz.

connect

Bu olay, Socket örneği bağlantı ve yeniden bağlantı sırasında tetiklenir.

socket.on("connect", () => {
// ...
});
uyarı

Olay işleyicileri connect işleyicisinde kaydedilmemelidir, çünkü soket örneği her yeniden bağlantıda yeni bir işleyici kaydedilecektir:

KÖTÜ ⚠️

socket.on("connect", () => {
socket.on("data", () => { /* ... */ });
});

İYİ 👍

socket.on("connect", () => {
// ...
});

socket.on("data", () => { /* ... */ });

connect_error

Bu olay, bağlantı hatası durumunda tetiklenir.

SebepOtomatik yeniden bağlantı?
Düşük seviyeli bağlantı kurulamadı (geçici hata)✅ EVET
Bağlantı, sunucu tarafından bir middleware işlevinde reddedildi❌ HAYIR

socket.active niteliği, soketin küçük bir rastgele gecikme sonunda otomatik olarak yeniden bağlanıp bağlanmayacağını gösterir:

socket.on("connect_error", (error) => {
if (socket.active) {
// geçici hata, soket otomatik olarak yeniden bağlanmaya çalışacak
} else {
// bağlantı sunucu tarafından reddedildi
// bu durumda, yeniden bağlanmak için `socket.connect()` manuel olarak çağrılmalıdır
console.log(error.message);
}
});

disconnect

  • reason ``
  • details ``

Bu olay, bağlantı kesildiğinde tetiklenir.

socket.on("disconnect", (reason, details) => {
// ...
});

Olası nedenlerin listesi:

SebepAçıklamaOtomatik yeniden bağlantı?
io server disconnectSunucu, socket.disconnect() ile soketi zorla kapatmıştır❌ HAYIR
io client disconnectSoket, socket.disconnect() kullanılarak manuel olarak kapatılmıştır❌ HAYIR
ping timeoutSunucu, pingInterval + pingTimeout aralığında bir PING göndermemiştir✅ EVET
transport closeBağlantı kapatılmıştır (örneğin: kullanıcı bağlantıyı kaybettiğinde veya ağ WiFi'den 4G'ye değiştiğinde)✅ EVET
transport errorBağlantıda bir hata oluşmuştur (örneğin: sunucu HTTP uzun-polling döngüsü sırasında kapatıldığında)✅ EVET

socket.active niteliği, soketin küçük bir rastgele gecikme sonunda otomatik olarak yeniden bağlanıp bağlanmayacağını gösterir:

socket.on("disconnect", (reason) => {
if (socket.active) {
// geçici kesinti, soket otomatik olarak yeniden bağlanmaya çalışacak
} else {
// bağlantı, sunucu veya istemci tarafından zorla kapatılmıştır
// bu durumda, yeniden bağlanmak için `socket.connect()` manuel olarak çağrılmalıdır
console.log(reason);
}
});
uyarı

Aşağıdaki olay adları rezerve edilmiştir ve uygulamanızda kullanılmamalıdır:

  • connect
  • connect_error
  • disconnect
  • disconnecting
  • newListener
  • removeListener
// KÖTÜ, hata fırlatacaktır
socket.emit("disconnect");

Tam API

Socket örneğinin sağladığı tam API burada bulunabilir.