socket.io ve websockets arasındaki farklar nelerdir?
node.js?
İkisi de sunucu itme teknolojileri mi?
Hissettiğim tek fark şuydu,
socket.io, bir olay adı belirterek mesaj göndermeme/yayınlamama izin verdi.
Socket.io durumunda sunucudan gelen bir mesaj tüm istemcilere ulaşacaktır, ancak websockets'te aynı şey için tüm bağlantıların bir dizisini tutmak ve tüm istemcilere mesaj göndermek için bunun üzerinden döngü yapmak zorunda kaldım.
Ayrıca, Acaba web denetçileri (Chrome/firebug/fiddler gibi) sunucudan gelen bu mesajları (socket.io/websocket'ten) neden yakalayamıyor?
Lütfen bunu açıklığa kavuşturun.
WebSocket ve Socket.IO ile ilgili birkaç yaygın yanlış anlama vardır:
İlk yanlış anlama, Socket.IO kullanmanın WebSocket kullanmaktan çok daha kolay olduğudur ki durum böyle görünmemektedir. Aşağıdaki örneklere bakın.
İkinci yanılgı ise WebSocket'in tarayıcılarda yaygın olarak desteklenmediğidir. Daha fazla bilgi için aşağıya bakınız.
Üçüncü yanlış anlama ise Socket.IO'nun eski tarayıcılarda geri dönüş olarak bağlantıyı düşürdüğüdür. Aslında tarayıcının eski olduğunu varsayar ve sunucuya bir AJAX bağlantısı başlatır, bu bağlantı daha sonra bazı trafik alışverişi yapıldıktan sonra WebSocket'i destekleyen tarayıcılarda yükseltilir. Ayrıntılar için aşağıya bakın.
WebSocket ve Socket.IO arasındaki farkı göstermek için bir npm modülü yazdım:
Bu, sunucu tarafı ve istemci tarafı kodunun basit bir örneğidir - istemci WebSocket veya Socket.IO kullanarak sunucuya bağlanır ve sunucu, istemci tarafından DOM'a eklenen 1 saniyelik aralıklarla üç mesaj gönderir.
Aynı işlemi bir Express.js uygulamasında yapmak için WebSocket ve Socket.IO kullanımının sunucu tarafı örneğini karşılaştırın:
Express.js kullanan WebSocket sunucu örneği:
var path = require('path');
var app = require('express')();
var ws = require('express-ws')(app);
app.get('/', (req, res) => {
console.error('express connection');
res.sendFile(path.join(__dirname, 'ws.html'));
});
app.ws('/', (s, req) => {
console.error('websocket connection');
for (var t = 0; t < 3; t++)
setTimeout(() => s.send('message from server', ()=>{}), 1000*t);
});
app.listen(3001, () => console.error('listening on http://localhost:3001/'));
console.error('websocket example');
Kaynak: https://github.com/rsp/node-websocket-vs-socket.io/blob/master/ws.js
Express.js kullanan Socket.IO sunucu örneği:
var path = require('path');
var app = require('express')();
var http = require('http').Server(app);
var io = require('socket.io')(http);
app.get('/', (req, res) => {
console.error('express connection');
res.sendFile(path.join(__dirname, 'si.html'));
});
io.on('connection', s => {
console.error('socket.io connection');
for (var t = 0; t < 3; t++)
setTimeout(() => s.emit('message', 'message from server'), 1000*t);
});
http.listen(3002, () => console.error('listening on http://localhost:3002/'));
console.error('socket.io example');
Kaynak: https://github.com/rsp/node-websocket-vs-socket.io/blob/master/si.js
Aynı işlemi tarayıcıda yapmak için WebSocket ve Socket.IO kullanımının istemci tarafı örneğini karşılaştırın:
Vanilla JavaScript kullanan WebSocket istemci örneği:
var l = document.getElementById('l');
var log = function (m) {
var i = document.createElement('li');
i.innerText = new Date().toISOString()+' '+m;
l.appendChild(i);
}
log('opening websocket connection');
var s = new WebSocket('ws://'+window.location.host+'/');
s.addEventListener('error', function (m) { log("error"); });
s.addEventListener('open', function (m) { log("websocket connection open"); });
s.addEventListener('message', function (m) { log(m.data); });
Kaynak: https://github.com/rsp/node-websocket-vs-socket.io/blob/master/ws.html
Vanilla JavaScript kullanan Socket.IO istemci örneği:
var l = document.getElementById('l');
var log = function (m) {
var i = document.createElement('li');
i.innerText = new Date().toISOString()+' '+m;
l.appendChild(i);
}
log('opening socket.io connection');
var s = io();
s.on('connect_error', function (m) { log("error"); });
s.on('connect', function (m) { log("socket.io connection open"); });
s.on('message', function (m) { log(m); });
Kaynak: https://github.com/rsp/node-websocket-vs-socket.io/blob/master/si.html
Ağ trafiğindeki farkı görmek için testimi çalıştırabilirsiniz. İşte elde ettiğim sonuçlar:
Bu iki istekten:
(Bağlantı yükseltme isteği, geliştirici araçlarında 101 Anahtarlama Protokolleri yanıtı ile görünür).
Bu 6 istekten:
Localhost üzerinde aldığım WebSocket sonuçları:
Localhost üzerinde aldığım Socket.IO sonuçları:
Hızlı başlangıç:
# Install:
npm i -g websocket-vs-socket.io
# Run the server:
websocket-vs-socket.io
Tarayıcınızda http://localhost:3001/ adresini açın, Shift+Ctrl+I ile geliştirici araçlarını açın, Ağ sekmesini açın ve WebSocket sürümünün ağ trafiğini görmek için Ctrl+R ile sayfayı yeniden yükleyin.
Tarayıcınızda http://localhost:3002/ adresini açın, Shift+Ctrl+I ile geliştirici araçlarını açın, Ağ sekmesini açın ve Socket.IO sürümünün ağ trafiğini görmek için Ctrl+R ile sayfayı yeniden yükleyin.
Kaldırmak için:
# Uninstall:
npm rm -g websocket-vs-socket.io
Haziran 2016 itibariyle WebSocket, 9'dan yüksek IE dahil olmak üzere Opera Mini dışındaki her şeyde çalışmaktadır.
Bu, WebSocket'in Haziran 2016 itibariyle Kullanabilir miyim üzerindeki tarayıcı uyumluluğudur:
Güncel bilgiler için http://caniuse.com/websockets adresine bakınız.
Avantajları, #2'de açıkladığınız gibi WebSockets kullanımını basitleştirmesi ve muhtemelen daha da önemlisi, WebSockets'in tarayıcı veya sunucuda desteklenmemesi durumunda diğer protokollere yük devretme sağlamasıdır. Hangi ortamlarda çalışmadıklarını çok iyi bilmiyorsanız ve bu sınırlamalar etrafında çalışabiliyorsanız, WebSockets'i doğrudan kullanmaktan kaçınırdım.
Bu, hem WebSockets hem de Socket.IO hakkında iyi bir okuma.
Socket.io kullanımına karşı bir argüman sunacağım.
Bence socket.io'yu sadece geri dönüşleri olduğu için kullanmak iyi bir fikir değil. IE8'in çökmesine izin ver.
Geçmişte NodeJS'in yeni sürümlerinin socket.io'yu bozduğu birçok durum olmuştur. Örnekler için bu listeleri kontrol edebilirsiniz... https://github.com/socketio/socket.io/issues?q=install+error
Bir Android uygulaması veya mevcut uygulamanızla çalışması gereken bir şey geliştirecekseniz, muhtemelen WS ile çalışmakta sorun yaşamazsınız, socket.io size biraz sorun çıkarabilir...
Ayrıca Node.JS için WS modülünün kullanımı inanılmaz derecede basittir.