Apa perbedaan antara socket.io dan websockets di node.js? Mereka berdua server push teknologi? Satu-satunya perbedaan yang saya rasakan adalah,
soket.io memungkinkan saya untuk mengirimkan/memancarkan pesan dengan menyebutkan nama acara.
Dalam kasus socket.io pesan dari server akan mencapai pada semua klien, tetapi untuk hal yang sama di websockets saya dipaksa untuk membuat sebuah array dari semua koneksi dan loop melalui itu untuk mengirim pesan ke semua klien.
Juga, Aku bertanya-tanya mengapa web inspektur (seperti Chrome/firebug/fiddler) tidak mampu menangkap pesan-pesan ini (dari soket.io/websocket) dari server?
Segera mengklarifikasi hal ini.
Ada beberapa kesalahpahaman umum tentang WebSocket dan Socket.IO:
Kesalahpahaman pertama adalah yang menggunakan Soket.IO adalah secara signifikan lebih mudah daripada menggunakan WebSocket yang doesn't tampaknya menjadi kasus. Lihat contoh di bawah ini.
Kesalahpahaman kedua adalah bahwa WebSocket tidak banyak didukung di browser. Lihat di bawah untuk info lebih lanjut.
Ketiga kesalahpahaman adalah bahwa Soket.IO mengerdilkan koneksi sebagai fallback pada browser lama. Itu benar-benar menganggap bahwa browser yang lebih tua dan mulai AJAX koneksi ke server, yang akan kemudian ditingkatkan pada browser mendukung WebSocket, setelah beberapa lalu lintas dipertukarkan. Lihat di bawah untuk rincian.
Saya menulis sebuah npm modul untuk menunjukkan perbedaan antara WebSocket dan Socket.IO:
Itu adalah contoh sederhana dari server-side dan client-side code - klien terhubung ke server baik menggunakan WebSocket atau Soket.IO dan server mengirimkan tiga pesan di 1s interval, yang ditambahkan ke DOM oleh klien.
Bandingkan dengan server-side contoh menggunakan WebSocket dan Socket.IO untuk melakukan hal yang sama di Express.js aplikasi:
WebSocket server contoh menggunakan Express.js:
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');
Sumber: https://github.com/rsp/node-websocket-vs-socket.io/blob/master/ws.js
Soket.IO server contoh menggunakan Express.js:
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');
Sumber: https://github.com/rsp/node-websocket-vs-socket.io/blob/master/si.js
Bandingkan sisi-klien contoh menggunakan WebSocket dan Socket.IO untuk melakukan hal yang sama di browser:
WebSocket klien misalnya dengan menggunakan vanilla JavaScript:
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); });
Sumber: https://github.com/rsp/node-websocket-vs-socket.io/blob/master/ws.html
Soket.IO klien misalnya dengan menggunakan vanilla JavaScript:
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); });
Sumber: https://github.com/rsp/node-websocket-vs-socket.io/blob/master/si.html
Untuk melihat perbedaan dalam lalu lintas jaringan anda dapat menjalankan tes saya](https://github.com/rsp/node-websocket-vs-socket.io#readme). Berikut adalah hasil yang saya dapatkan:
Dari orang-orang 2 permintaan:
(Sambungan upgrade permintaan terlihat pada alat-alat pengembang dengan 101 Switching Protocols respon.)
Dari 6 permintaan:
WebSocket hasil yang saya dapatkan di localhost:
Soket.IO hasil yang saya dapatkan di localhost:
Mulai cepat:
# Install:
npm i -g websocket-vs-socket.io
# Run the server:
websocket-vs-socket.io
Buka http://localhost:3001/ di browser anda, buka alat pengembang dengan Shift+Ctrl+I, buka tab Network dan reload halaman dengan Ctrl+R untuk melihat lalu lintas jaringan untuk WebSocket versi.
Buka http://localhost:3002/ di browser anda, buka alat pengembang dengan Shift+Ctrl+I, buka tab Network dan reload halaman dengan Ctrl+R untuk melihat lalu lintas jaringan untuk Soket.IO versi.
Untuk uninstall:
# Uninstall:
npm rm -g websocket-vs-socket.io
Pada juni 2016 WebSocket bekerja pada segala sesuatu kecuali Opera Mini, termasuk IE lebih tinggi daripada 9.
Ini adalah browser kompatibilitas WebSocket pada Dapatkah saya Menggunakan pada juni 2016:
Lihat http://caniuse.com/websockets untuk up-to-date informasi.
Keuntungannya adalah bahwa hal itu menyederhanakan penggunaan WebSockets seperti yang anda gambarkan di #2, dan mungkin yang lebih penting itu menyediakan fail-over untuk protokol lain dalam acara yang WebSockets tidak didukung pada browser atau server. Saya akan menghindari menggunakan WebSockets langsung kecuali anda sangat akrab dengan lingkungan mereka don't bekerja dan anda mampu bekerja di sekitar keterbatasan mereka.
Ini adalah membaca yang baik pada kedua WebSockets dan Socket.IO.
Im akan memberikan argumen terhadap menggunakan socket.io.
Saya pikir menggunakan socket.io semata-mata karena ia memiliki fallbacks bukan ide yang baik. Mari IE8 RIP.
Di masa lalu telah ada banyak kasus di mana versi baru dari NodeJS memiliki socket rusak.io. Anda dapat memeriksa daftar ini untuk contoh... https://github.com/socketio/socket.io/issues?q=install+kesalahan
Jika anda pergi untuk mengembangkan sebuah aplikasi Android atau sesuatu yang perlu untuk bekerja dengan aplikasi yang ada, anda mungkin akan baik-baik saja bekerja dengan WS langsung, socket.io mungkin memberi anda beberapa masalah di sana...
Ditambah WS modul untuk Node.JS ini sangat sederhana untuk digunakan.
Menggunakan Socket.IO pada dasarnya adalah seperti menggunakan jQuery - anda ingin mendukung browser lama, anda perlu menulis kode kurang dan perpustakaan akan memberikan dengan fallbacks. Soket.io menggunakan websockets teknologi jika tersedia, dan jika tidak, cek yang terbaik jenis komunikasi yang tersedia dan menggunakannya.
Soket.IO menggunakan WebSocket dan ketika WebSocket tidak tersedia menggunakan mundur algo untuk membuat koneksi real time.
Bahkan jika browser modern mendukung WebSockets sekarang, saya pikir tidak perlu untuk membuang SocketIO jauh dan itu masih memiliki tempat di manapun saat ini proyek. It's mudah untuk memahami, dan secara pribadi, saya belajar bagaimana WebSockets bekerja terima kasih untuk SocketIO.
Seperti dikatakan dalam topik ini, ada's banyak integrasi perpustakaan untuk Sudut, Bereaksi, dan sebagainya. dan definisi jenis Ketangkasan dan bahasa pemrograman lainnya.
Hal lain yang saya akan menambahkan perbedaan antara Socket.io dan WebSockets adalah bahwa clustering dengan Socket.io adalah bukan masalah besar. Soket.io menawarkan Adapter yang dapat digunakan untuk menghubungkannya dengan Redis untuk meningkatkan skalabilitas. Anda memiliki ioredis dan soket.io-redis misalnya.
Ya saya tahu, SocketCluster ada, tapi yang's off-topic.