Różnice między socket.io i websockets

Jakie są różnice między socket.io i websockets w węzeł.js?
Czy obie technologie Server push? Jedyne różnice jakie odczuwałem to:

  1. Socket.io pozwala mi wysyłać / emitować wiadomości poprzez podanie nazwy zdarzenia.

  2. W przypadku socket.io wiadomość z serwera dotrze do wszystkich klientów, ale dla tego samego w websockets byłem zmuszony zachować tablicę wszystkich połączeń i pętli przez nią wysyłać wiadomości do wszystkich klientów.

Także, Ciekawe dlaczego inspektorzy sieci (np. Chrome / firebug/fiddler) nie są w stanie wyłapać tych komunikatów (z socket.io/websocket) z serwera?

Proszę to wyjaśnić.

Author: Kevin Guan, 2012-04-11

5 answers

Socket.IO używa WebSockets, gdy może.

Jego zaletą jest to, że upraszcza korzystanie z WebSockets, jak opisano w #2, i prawdopodobnie co ważniejsze zapewnia przełączanie awaryjne do innych protokołów w przypadku, gdy WebSockets nie są obsługiwane w przeglądarce lub serwerze. Unikałbym bezpośredniego korzystania z WebSockets, chyba że jesteś bardzo zaznajomiony z tym, w jakich środowiskach nie działają i jesteś w stanie obejść te ograniczenia.

To jest dobra lektura na obu WebSockets i Socket.IO.

Http://davidwalsh.name/websocket

 255
Author: Timothy Strimple,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-04-12 18:38:57

Nieporozumienia

Istnieje kilka typowych nieporozumień dotyczących WebSocket i Socket.IO:

  1. Pierwszym błędnym założeniem jest to, że za pomocą Socket.IO jest znacznie łatwiejsze niż korzystanie z WebSocket, co wydaje się nie mieć miejsca. Zobacz przykłady poniżej.

  2. Drugim błędnym założeniem jest to, że WebSocket nie jest szeroko obsługiwany w przeglądarkach. Zobacz poniżej, aby uzyskać więcej informacji.

  3. Trzecie błędne przekonanie jest takie, że Socket.IO downgrades the connection jako alternatywa dla starszych przeglądarek. W rzeczywistości zakłada, że przeglądarka jest stara i rozpoczyna połączenie AJAX z serwerem, który zostaje później zaktualizowany w przeglądarkach obsługujących WebSocket, po wymianie ruchu. Szczegóły poniżej.

Mój eksperyment

Napisałem moduł npm, aby zademonstrować różnicę między WebSocket a Socket.IO:

Jest to prosty przykład kodu po stronie serwera i po stronie klienta - klient łączy się z serwerem za pomocą WebSocket lub Socket.IO a serwer wysyła trzy wiadomości w odstępach 1s, które są dodawane do DOM przez Klienta.

Po stronie serwera

Porównaj przykład użycia WebSocket po stronie serwera oraz Socket.IO zrobić to samo w ekspresie.aplikacja js:

WebSocket Server

WebSocket serwer przykład przy użyciu 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');

Źródło: https://github.com/rsp/node-websocket-vs-socket.io/blob/master/ws.js

Socket.IO Serwer

Socket.IO przykład serwera za pomocą programu 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');

Źródło: https://github.com/rsp/node-websocket-vs-socket.io/blob/master/si.js

Client-side

Porównaj przykład po stronie klienta korzystania z WebSocket i Socket.IO aby zrobić to samo w przeglądarce:

WebSocket Client

Przykład klienta WebSocket przy użyciu 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); });

Źródło: https://github.com/rsp/node-websocket-vs-socket.io/blob/master/ws.html

Socket.IO Klient

Socket.IO przykład klienta przy użyciu 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); });

Źródło: https://github.com/rsp/node-websocket-vs-socket.io/blob/master/si.html

Sieć traffic

Aby zobaczyć różnicę w ruchu sieciowym, możesz uruchomić mój test . Oto wyniki, które otrzymałem:

Wyniki WebSocket

2 zapytań, 1.50 KB, 0.05 s

Z tych 2 żądań:

  1. sama strona HTML
  2. Aktualizacja połączenia do WebSocket

(żądanie aktualizacji połączenia jest widoczne w narzędziach programistycznych z odpowiedzią 101 protokołów przełączania.)

Socket.IO Wyniki

6 zapytań, 181.56 KB, 0.25 s

Z tych 6 żądań:

  1. sama strona HTML
  2. Socket.IO " s JavaScript (180 kilobajtów)
  3. pierwsza długa ankieta
  4. second long ankiet AJAX request
  5. Third long ankiet AJAX request
  6. Aktualizacja połączenia do WebSocket

Screeny

Wyniki WebSocket, które dostałem na localhost:

Wyniki WebSocket - websocket-vs-socket.io moduł

Socket.IO wyniki, które dostałem na localhost:

Socket.IO wyniki - websocket-vs-socket.io moduł

Sprawdź się

Szybki start:

# Install:
npm i -g websocket-vs-socket.io
# Run the server:
websocket-vs-socket.io

Otwórz http://localhost:3001/ w przeglądarce otwórz Narzędzia programistyczne za pomocą Shift + Ctrl + I, otwórz kartę Sieć i przeładuj stronę za pomocą Ctrl + R, aby zobaczyć ruch sieciowy dla wersji WebSocket.

Otwórz http://localhost:3002/ w przeglądarce otwórz Narzędzia programistyczne za pomocą Shift+Ctrl + I, otwórz kartę Sieć i przeładuj stronę za pomocą Ctrl + R, aby zobaczyć sieć traffic for the Socket.IO wersja.

Aby odinstalować:

# Uninstall:
npm rm -g websocket-vs-socket.io

Zgodność przeglądarki

Od czerwca 2016 WebSocket działa na wszystkim oprócz Opery Mini, w tym IE wyższej niż 9.

Jest to przeglądarka kompatybilna z WebSocket na Czy Mogę używać od czerwca 2016:

Tutaj wpisz opis obrazka

Zobacz http://caniuse.com/websockets dla aktualnych informacji.

 337
Author: rsp,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-07-25 02:42:00

Im przedstawi argument przeciwko używaniu socket.io.

Myślę, że używając socket.io wyłącznie dlatego, że ma upadki nie jest dobrym pomysłem. Let IE8 RIP.

W przeszłości było wiele przypadków, w których nowe wersje NodeJS zostały złamane socket.io. możesz sprawdzić te listy pod kątem przykładów... https://github.com/socketio/socket.io/issues?q=install + błąd

Jeśli pójdziesz do opracowania aplikacji na Androida lub coś, co musi działać z istniejącą aplikacją, prawdopodobnie praca z WS od zaraz, socket.io to może przysporzyć ci kłopotów...

Plus moduł ws dla węzła.JS jest niezwykle prosty w użyciu.

 26
Author: Victorio Berra,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-02-11 15:12:47

Za pomocą Socket.IO to w zasadzie jak korzystanie z jQuery - chcesz obsługiwać starsze przeglądarki, musisz napisać mniej kodu, a biblioteka dostarczy Ci fallbacks. Socket.io używa technologii websockets, jeśli jest dostępna, a jeśli nie, sprawdza najlepszy dostępny typ komunikacji i korzysta z niej.

 15
Author: Dev Agrawal,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-12-21 06:32:46

Socket.IO używa WebSocket, a gdy WebSocket nie jest dostępny, używa fallback algo do nawiązywania połączeń w czasie rzeczywistym.

 5
Author: Nitin Tyagi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-08-17 09:46:44