Was sind die Unterschiede zwischen socket.io und websockets in node.js?
Sind beide Server-Push-Technologien? Die einzigen Unterschiede, die ich fühlte, waren:
Mit socket.io konnte ich Nachrichten durch Angabe eines Ereignisnamens senden / senden.
Im Fall von socket.io wird eine Nachricht vom Server auf allen Clients erreicht, aber für dasselbe in Websockets war ich gezwungen, ein Array aller Verbindungen beizubehalten und es zu durchlaufen, um Nachrichten an alle Clients zu senden.
Ich frage mich auch, warum Webinspektoren (wie Chrome / Firebug / Fiddler) diese Nachrichten (von socket.io/websocket) nicht vom Server abfangen können.
Bitte klären Sie dies.
Antworten:
Seine Vorteile sind, dass es die Verwendung von WebSockets vereinfacht, wie Sie in # 2 beschrieben haben, und wahrscheinlich noch wichtiger ist, dass es Failover für andere Protokolle bietet, falls WebSockets vom Browser oder Server nicht unterstützt werden. Ich würde es vermeiden, WebSockets direkt zu verwenden, es sei denn, Sie kennen die Umgebungen, in denen sie nicht funktionieren, und Sie sind in der Lage, diese Einschränkungen zu umgehen.
Dies ist eine gute Lektüre sowohl für WebSockets als auch für Socket.IO.
http://davidwalsh.name/websocket
quelle
Missverständnisse
Es gibt nur wenige häufige Missverständnisse in Bezug auf WebSocket und Socket.IO:
Das erste Missverständnis ist, dass die Verwendung von Socket.IO erheblich einfacher ist als die Verwendung von WebSocket, was anscheinend nicht der Fall ist. Siehe Beispiele unten.
Das zweite Missverständnis ist, dass WebSocket in den Browsern nicht allgemein unterstützt wird. Siehe unten für weitere Informationen.
Das dritte Missverständnis ist, dass Socket.IO die Verbindung als Fallback für ältere Browser herunterstuft. Es wird davon ausgegangen, dass der Browser alt ist und eine AJAX-Verbindung zum Server herstellt, die später in Browsern, die WebSocket unterstützen, aktualisiert wird, nachdem ein Teil des Datenverkehrs ausgetauscht wurde. Siehe unten für Details.
Mein Experiment
Ich habe ein npm-Modul geschrieben, um den Unterschied zwischen WebSocket und Socket.IO zu demonstrieren:
Dies ist ein einfaches Beispiel für serverseitigen und clientseitigen Code. Der Client stellt über WebSocket oder Socket.IO eine Verbindung zum Server her und der Server sendet drei Nachrichten in Intervallen von 1 Sekunde, die vom Client zum DOM hinzugefügt werden.
Serverseitig
Vergleichen Sie das serverseitige Beispiel für die Verwendung von WebSocket und Socket.IO, um dasselbe in einer Express.js-App zu tun:
WebSocket Server
Beispiel für einen WebSocket-Server mit Express.js:
Quelle: https://github.com/rsp/node-websocket-vs-socket.io/blob/master/ws.js
Socket.IO Server
Beispiel für einen Socket.IO-Server mit Express.js:
Quelle: https://github.com/rsp/node-websocket-vs-socket.io/blob/master/si.js
Client-Seite
Vergleichen Sie das clientseitige Beispiel für die Verwendung von WebSocket und Socket.IO, um dasselbe im Browser zu tun:
WebSocket Client
Beispiel für einen WebSocket-Client mit Vanille-JavaScript:
Quelle: https://github.com/rsp/node-websocket-vs-socket.io/blob/master/ws.html
Socket.IO Client
Beispiel für einen Socket.IO-Client mit Vanille-JavaScript:
Quelle: https://github.com/rsp/node-websocket-vs-socket.io/blob/master/si.html
Netzwerktraffic
Um den Unterschied im Netzwerkverkehr zu sehen, können Sie meinen Test ausführen . Hier sind die Ergebnisse, die ich erhalten habe:
WebSocket-Ergebnisse
2 Anfragen, 1,50 KB, 0,05 s
Aus diesen 2 Anfragen:
(Die Verbindungsaktualisierungsanforderung wird in den Entwicklertools mit einer Antwort von 101 Switching Protocols angezeigt.)
Socket.IO Ergebnisse
6 Anfragen, 181,56 KB, 0,25 s
Aus diesen 6 Anfragen:
Screenshots
WebSocket-Ergebnisse, die ich auf localhost erhalten habe:
Socket.IO Ergebnisse, die ich auf localhost erhalten habe:
Teste dich selbst
Schnellstart:
Öffnen Sie http: // localhost: 3001 / in Ihrem Browser, öffnen Sie die Entwicklertools mit Umschalt + Strg + I, öffnen Sie die Registerkarte Netzwerk und laden Sie die Seite mit Strg + R neu, um den Netzwerkverkehr für die WebSocket-Version anzuzeigen.
Öffnen Sie http: // localhost: 3002 / in Ihrem Browser, öffnen Sie die Entwicklertools mit Umschalt + Strg + I, öffnen Sie die Registerkarte Netzwerk und laden Sie die Seite mit Strg + R neu, um den Netzwerkverkehr für die Socket.IO-Version anzuzeigen.
So deinstallieren Sie:
Browser-Kompatibilität
Ab Juni 2016 funktioniert WebSocket mit Ausnahme von Opera Mini, einschließlich IE über 9.
Dies ist die Browserkompatibilität von WebSocket für Kann ich ab Juni 2016 verwenden:
Aktuelle Informationen finden Sie unter http://caniuse.com/websockets .
quelle
Ich werde ein Argument gegen die Verwendung von socket.io liefern.
Ich denke, die Verwendung von socket.io nur, weil es Fallbacks gibt, ist keine gute Idee. Lassen Sie IE8 RIP.
In der Vergangenheit gab es viele Fälle, in denen neue Versionen von NodeJS socket.io beschädigt haben. Sie können diese Listen auf Beispiele überprüfen ... https://github.com/socketio/socket.io/issues?q=install+error
Wenn Sie eine Android-App entwickeln oder etwas, das mit Ihrer vorhandenen App funktionieren muss, ist es wahrscheinlich in Ordnung, sofort mit WS zu arbeiten. Socket.io kann Ihnen dort Probleme bereiten ...
Außerdem ist das WS-Modul für Node.JS erstaunlich einfach zu bedienen.
quelle
Die Verwendung von Socket.IO ähnelt im Wesentlichen der Verwendung von jQuery. Sie möchten ältere Browser unterstützen, müssen weniger Code schreiben und die Bibliothek bietet Fallbacks. Socket.io verwendet die Websockets-Technologie, falls verfügbar, und überprüft, falls nicht, den besten verfügbaren Kommunikationstyp und verwendet ihn.
quelle
Selbst wenn moderne Browser jetzt WebSockets unterstützen, besteht meiner Meinung nach keine Notwendigkeit, SocketIO wegzuwerfen, und es hat immer noch seinen Platz in einem heutigen Projekt. Es ist leicht zu verstehen und ich persönlich habe dank SocketIO gelernt, wie WebSockets funktionieren.
Wie in diesem Thema erwähnt, gibt es zahlreiche Integrationsbibliotheken für Angular, React usw. und Definitionstypen für TypeScript und andere Programmiersprachen.
Der andere Punkt, den ich zu den Unterschieden zwischen Socket.io und WebSockets hinzufügen möchte, ist, dass das Clustering mit Socket.io keine große Sache ist. Socket.io bietet Adapter an , mit denen es mit Redis verknüpft werden kann, um die Skalierbarkeit zu verbessern. Sie haben zum Beispiel ioredis und socket.io-redis .
Ja, ich weiß, SocketCluster existiert, aber das ist kein Thema.
quelle
Socket.IO verwendet WebSocket. Wenn WebSocket nicht verfügbar ist, wird Fallback-Algo verwendet, um Echtzeitverbindungen herzustellen.
quelle
https://socket.io/docs/#What-Socket-IO-is-not (mit meinem Schwerpunkt )
quelle