Unterschied zwischen Socket und Websocket?

177

Ich erstelle eine Web-App, die über Socket-Verbindungen mit einer anderen Anwendung kommunizieren muss. Das ist Neuland für mich, so will sicher sein , dass Steckdosen sind anders als WebSockets . Es scheint, als wären sie nur konzeptionell ähnlich.

Fragen, weil ich ursprünglich geplant hatte, Django als Grundlage für mein Projekt zu verwenden, aber in dem oben verlinkten SO-Beitrag wurde sehr deutlich gemacht, dass Websockets nicht möglich (oder zumindest nicht zuverlässig sind, selbst mit so etwas wie Django-Websockets) ) mit dem bevorzugten Django-Setup (Apache mit mod_wsgi). Ich habe jedoch andere Beiträge gefunden, die das Python-Socket-Modul beiläufig importieren, um den Hostnamen des Servers zu ermitteln .

So:

  • Sind sie wirklich anders?
  • Gibt es einen Grund, Django nicht für ein Projekt zu verwenden, bei dem Socket-Verbindungen mit einem externen Server hergestellt werden müssen?
Jonathon
quelle

Antworten:

140

Um Ihre Fragen zu beantworten.

  1. Auch wenn sie (im Allgemeinen) ähnliche Dinge erreichen, ja , sie sind wirklich anders. WebSockets werden normalerweise von Browsern ausgeführt, die über ein Protokoll ähnlich wie HTTP , das über TCP / IP ausgeführt wird, eine Verbindung zu Application Server herstellen . Sie sind also hauptsächlich für Webanwendungen gedacht, für die eine permanente Verbindung zum Server erforderlich ist. Auf der anderen Seite sind einfache Steckdosen leistungsfähiger und allgemeiner. Sie laufen über TCP / IP , sind jedoch nicht auf Browser oder das HTTP- Protokoll beschränkt. Sie könnten verwendet werden, um jede Art von Kommunikation zu implementieren.
  2. Nein, es gibt keinen Grund.
Pablo Santa Cruz
quelle
127
WebSockets ähneln nicht HTTP. Es handelt sich um normale Sockets mit einigen Rahmen und einem HTTP-kompatiblen Handshake. Der HTTP-kompatible Handshake dient nur dazu, eine WebSocket-Verbindung an demselben Port zuzulassen, auf dem ein Webserver ausgeführt wird (damit der Webserver sie weiterleiten kann). Sobald die Verbindung hergestellt ist, befindet sich der Webserver jedoch nicht in der Schleife. WebSockets ist nicht auf Browser-Clients beschränkt. Siehe libwebsocket, das sowohl einen Nicht-Browser-Client als auch einen Server enthält.
Kanaka
13
OK. Ich verstehe ... Da ich diese akzeptierte Antwort nicht löschen kann, bitte ich Sie, sie mit den richtigen Informationen zu bearbeiten. Vielen Dank!
Pablo Santa Cruz
1
Sie können Websocket-Clients erstellen und außerhalb von Browsern verwenden. Das Websocket-Protokoll ist HTTP 1.1 mit einer aktualisierten Verbindung zu "Websocket".
Roger F. Gay
2
@huggie nein. Es gibt ein kleines bisschen Framing: tools.ietf.org/html/rfc6455#section-5 (2 Bytes für kleine Nachrichten).
Kanaka
2
@ NiCkNewman das ist wahrscheinlich eine gute separate Frage. Der Framing-Overhead ist minimal und nicht das Problem. Das Problem mit WebSockets für MMO-Netzwerke besteht in zweierlei Hinsicht: Es handelt sich nur um einen Client-Server und um TCP (Stream-basiert). Für eine gute MMO-Netzwerkleistung benötigen Sie außerdem ein direktes Peer-to-Peer-Netzwerk und ein Datagramm (eine konstant niedrige Latenz ist wichtiger als der Empfang jedes Pakets). Die gute Nachricht ist, dass WebRTC DataChannel über beide Eigenschaften verfügt, sodass die Lücke geschlossen wird und vollständige AAA-MMO-Spiele im Browser möglich sind.
Kanaka
21

Websockets verwenden bei ihrer Implementierung Sockets. Websockets basieren auf einem Standardprotokoll (jetzt im letzten Aufruf, aber noch nicht endgültig), das eine Verbindung "Handshake" und Nachricht "Frame" definiert. Die beiden Seiten durchlaufen die Handshake-Prozedur, um eine Verbindung gegenseitig zu akzeptieren, und verwenden dann das Standardnachrichtenformat ("Frame"), um Nachrichten hin und her zu leiten.

Ich entwickle ein Framework, mit dem Sie mit installierter Software direkt von Maschine zu Maschine kommunizieren können. Es könnte Ihrem Zweck entsprechen. Sie können meinem Blog folgen, wenn Sie möchten: http://highlevellogic.blogspot.com/2011/09/websocket-server-demonstration_26.html

Roger F. Gay
quelle
11

Sie müssten WebSockets (oder ein ähnliches Protokollmodul, wie es vom Flash-Plugin unterstützt wird) verwenden, da eine normale Browseranwendung einfach keinen reinen TCP-Socket öffnen kann.

Das Socket.IOfür verfügbare Modul node.jskann viel helfen, aber beachten Sie, dass es kein eigenständiges WebSocket-Modul ist.

Es ist eigentlich ein allgemeineres Kommunikationsmodul, das auf verschiedenen anderen Netzwerkprotokollen ausgeführt werden kann, einschließlich WebSockets und Flash-Sockets.

Wenn Sie also Socket.IOauf der Serverseite verwenden möchten, müssen Sie auch deren Clientcode und Objekte verwenden. Sie können nicht einfach unformatierte WebSocketVerbindungen zu einem socket.ioServer herstellen, da Sie dessen Nachrichtenprotokoll emulieren müssten.

Alnitak
quelle
10

WebSocket ist genau wie HTTP nur ein weiteres Protokoll auf Anwendungsebene über das TCP-Protokoll.

Einige der unten aufgeführten Ausschnitte <Spring in Action 4> sollen Ihnen helfen, WebSocket besser zu verstehen.

In seiner einfachsten Form ist ein WebSocket nur ein Kommunikationskanal zwischen zwei Anwendungen (nicht unbedingt ein Browser). Die WebSocket-Kommunikation kann zwischen beliebigen Arten von Anwendungen verwendet werden. Die häufigste Verwendung von WebSocket ist jedoch die Erleichterung der Kommunikation zwischen a Serveranwendung und eine browserbasierte Anwendung.

smwikipedia
quelle
2

Beachten Sie bei Ihrer Frage (b), dass die Websocket-Spezifikation noch nicht fertiggestellt wurde. Laut W3C :

Implementierer sollten sich bewusst sein, dass diese Spezifikation nicht stabil ist.

Persönlich halte ich Websockets für zu aktuell, um sie derzeit zu verwenden. Obwohl ich sie wahrscheinlich in ungefähr einem Jahr nützlich finden werde.

Phil Hunt
quelle
Was ist jetzt, 9 Jahre später?
Venryx