Node.js socket.io Modülü

Anlık olarak mesajlaşma, oyun ve gerçek zamanlı uygulama geliştirmeye imkan veren socket.io kullanımı ile ilgili bilgiler yer alıyor.

Socket.io nedir?

Socket.IO gerçek zamanlı ve karşılıklı veri alışverişine ihtiyaç duyan uygulamalar geliştirmek için kullanılan Node.js modülüdür.

Socket.IO karşılıklı veri alışverişi yapmak için tarayıcı desteğine göre WebSocket, AJAX, Flash Socket gibi çeşitli yöntemleri kullanarak eski tarayıcılarda da karşılıklı veri alışverişine imkan verir.

WebSocket ile veri alışverişi sırasında mesajların yorumlanması gibi çeşitli zorluklar yaşanır.

Socket.IO içindeki Event yönetimi sayesinde sunucu ve istemci taraflı özel olaylar oluşturarak iletişim daha kolay yönetilir.

Modül bir iletişim sunucusu oluştururken içinde yer alan JavaScript kütüphaneleri sayesinde istemci tarafındaki işlemleri de kolaylaştırır.

Socket.io kurulumu

Modülü aşağıdaki komutlar kullanılarak indirilir.

npm install socket.io
veya
npm install socket.io --save

Socket.io kullanımı

Modülün çeşitli kullanımı vardır.

Sunucu oluşturmak

Socket.IO modülü ile başka bir modüle ihtiyaç duymadan sunucu oluşturmak için aşağıdaki kodlar kullanılabilir.

const socketIO = require('socket.io');
const io = socketIO(1234);

io.on('connection', (socket) => {
  console.log('Bir kullanıcı bağlandı: ' + socket.id);

  socket.on('disconnect', () => {
    console.log('Bir kullanıcı ayrıldı: ' + socket.id);
  });
});

Kodlar incelendiğinde modül projeye dahil edilmiş ve yayın yapacağı port numarası olarak 1234 belirlenmiştir.

Bu port numarasına istemci bağlandığında tetiklenen connection olayı ile veri alışverişi yapılmıştır.

Olay parametresi içinde yer alan id, connected gibi özellikler ve send, on, emit gibi metotlar kullanılarak veri alışverişi yönetilir.

Sunucuya bağlanmak

Socket.IO sunucu ile birlikte istemci tarafındaki işlemleri yapmak için JavaScript kütüphanesini sunucu-adresi/socket.io/socket.io.js adresine bağlar.

JavaScript kütüphanesi herhangi bir HTML dosyasına eklenerek işlem yapılır.

Kütüphane ayrıca çeşitli CDN servislerinde de yer almaktadır.

<script src="http://localhost:1234/socket.io/socket.io.js"></script>
<script>
  let socket = io("http://localhost:1234");
</script>

Gerekli kodlar HTML dosyasına eklenip çalıştırıldığında komut yorumlayıcısında aşağıdaki mesaj ekrana yazılacaktır.

Bir kullanıcı bağlandı: R2T...

Mesaj göndermek

Socket.IO ile sunucudan istemciye mesaj göndermek için send metodu kullanılabilir.

const socketIO = require('socket.io');
const io = socketIO(1234);

io.on('connection', (socket) => {

  socket.send('Hoşgeldiniz sayın ' + socket.id);
  //socket.emit('message', 'Hoşgeldiniz sayın ' + socket.id);

});

Metot message olayını tetikleyerek parametre ile yazılan değeri gönderir.

Metot message olayını tetiklediğinden dolayı bu işlem olay tetikleme metodu olan emit metotu ile de yapılabilir.

Mesajı işlemek

Gönderilen mesaj tetiklenen olayları yakalamak için kullanılan on metodu ile alınarak gönderilen değere ulaşılır.

let socket = io("http://localhost:1234");

socket.on("message", (mesaj) => {
  document.body.textContent = mesaj;
});

Özel olay oluşturmak

Socket.IO modülünün en önemli özelliği özel olay oluşturmaya imkan vermesidir.

Özel bir olay oluşturmak veya tetiklemek için emit metodu kullanılır.

const socketIO = require('socket.io');
const io = socketIO(1234);

io.on('connection', (socket) => {

  socket.emit('merhaba socket.io', 'Merhaba ben özel bir olay tarafından gönderiliyorum.');

});

Oluşturulan olay on metodu ile yakalanarak gönderilen veriye erişilir.

let socket = io("http://localhost:1234");

socket.on("merhaba socket.io", (mesaj) => {
  document.body.textContent = mesaj;
});

Gönderilen veri metin olabileceği gibi nesne, dizi gibi çeşitli türdeki verilerde olabilir.

const socketIO = require('socket.io');
const io = socketIO(1234);

io.on('connection', (socket) => {

  socket.emit('merhaba socket.io', {
    mesaj: 'Merhaba ben özel bir mesajım.',
    tarih: `${new Date().getHours()}:${new Date().getMinutes()}`
  });

});

Sunucudan gönderilen veri istemci tarafında uygun bir şekilde alınarak gerekli işlemler yapılır.

let socket = io("http://localhost:1234");

socket.on("merhaba socket.io", (veri) => {
  document.body.textContent = veri.mesaj + " " + veri.tarih;
});

Olay sunucudan oluşturulabileceği gibi istemci tarafından da oluşturulabilir.

let socket = io("http://localhost:1234");

socket.emit("merhaba socket.io", {
  mesaj: "Merhaba ben özel bir mesajım.",
  tarih: new Date().getHours() + ":" + new Date().getMinutes()
});

İstemci tarafından tetiklenen olay sunucu tarafında on metodu ile yakalanarak işlem yapılır.

const socketIO = require('socket.io');
const io = socketIO(1234);

io.on('connection', (socket) => {

  socket.on('merhaba socket.io', (veri) => {
    console.log(veri.mesaj + ' ' + veri.tarih);
  });

});

Diğer istemcilere mesaj atmak

Socket.IO ile bir istemciden diğer istemcilerle iletişim kurmak için socket.broadcast nesnesi kullanılır.

Nesne içerisinde send, on ve emit gibi metotlara sahiptir.

const socketIO = require('socket.io');
const io = socketIO(1234);

io.on('connection', (socket) => {

  socket.broadcast.send('Yeni bir kullanıcı bağlandı: ' + socket.id);
  //socket.broadcast.emit('message', 'Yeni bir kullanıcı bağlandı: ' + socket.id);

});

Sunucu tarafından gönderilen veri benzer şekilde on metodu ile yakalanarak işlem yapılır.

let socket = io("http://localhost:1234");

socket.on("message", (mesaj) => {
  document.body.innerHTML += mesaj + "<br />";
});

Sonucu birden fazla tarayıcı veya sekme açarak görebilirsiniz.

Tüm istemcilere mesaj göndermek

Socket.IO ile sunucuya bağlı tüm istemcilere mesaj göndermek için modül içerisinde yer alan io.sockets nesnesi kullanılır.

Nesne içerisinde send, on ve emit gibi metotlara sahiptir.

const socketIO = require('socket.io');
const io = socketIO(1234);

io.on('connection', (socket) => {

  io.sockets.send('Yeni bir kullanıcı bağlandı: ' + socket.id);
  //io.sockets.emit('message', 'Yeni bir kullanıcı bağlandı: ' + socket.id);

});

Sunucu tarafından gönderilen veri benzer şekilde on metodu ile yakalanarak işlem yapılır.

let socket = io("http://localhost:1234");

socket.on("message", (mesaj) => {
  document.body.innerHTML += mesaj + "<br />";
});

Sonucu birden fazla tarayıcı veya sekme açarak görebilirsiniz.

Özel mesaj göndermek

Bir istemciden sadece bir istemciye mesaj göndermek için to metodu kullanılır.

const socketIO = require('socket.io');
const io = socketIO(1234);

io.on('connection', (socket) => {

  socket.to('istemci-id').send('Merhaba naber?');

});

Metoda parametre olarak yazılan numaraya mesajı gönderecektir.

Diğer

Socket.IO içinde ayrıca pek fazla kullanılmayan ama oldukça yararlı namespaces ve rooms özelliği sayesinde istemciler çeşitli grup ve odalara ayrılabilir.

Dikkat edilmesi gerekenler?

Socket.IO içinde yer alan özellik ve metotlar sayesinde kolay bir şekilde gerçek zamanlı uygulamalar geliştirilebilir.

Ancak sunucu ve istemci tarafında herhangi bir sorun olduğunda bu sorunu kullanıcıya yansıtmadan iyi bir şekilde işlem yapılması faydalı olacaktır.

Örneğin; Bir mesajlaşma uygulamasında sunucu bağlantısı kesildiğinde istemciye bağlantı durumunun bildirilmesi ve mesaj gönderme işleminin devredışı bırakılması faydalı olacaktır.

Socket.IO kullanılarak geliştirilmiş örnek uygulama kodlarına bakmak için tıklayın.

Node.js Derslerine buradan ulaşabilirsiniz…

Hayırlı günler dilerim.

Yusuf SEZER

Yusuf SEZER

Computer Engineer who interested about web technologies, algorithms, artificial intelligence and embedded systems; constantly exploring new technologies.


Bunlara'da bakmalısın!