Grundsätze und die Verwendung von websocket

Was ist websocket

WebSocket durchgeführt auf einer einzigen TCP - Verbindung eine Vollduplex - Protokoll - Kommunikation. WebSocket ermöglicht den Austausch von Daten zwischen dem Client und dem Server zu erleichtern, so dass der Server aktiv Daten an das Client pushen. In der WebSocket - API, der Browser und der Server benötigt nur einen Händedruck zu vervollständigen, können Sie direkt eine ständige Verbindung zwischen den beiden, und Zwei-Wege - Datenübertragung schaffen.

WebSocket-Protokoll ist ein persistent, mit Bezug auf solchen nicht-persistent HTTP ist das Protokoll.

Zum Beispiel:

HTTP-Lebenszyklus von Request definiert, die eine Anfrage senden, erhält eine Antwort, dann HTTP1.0 in der HTTP-Anforderung ist über

HTTP1.1 die Verbesserung in einem solchen Keep-Alive, die eine Vielzahl von Anforderung werden wird, kann in einer HTTP-Verbindung gesendet, die eine Vielzahl Antwort zu erhalten. Aber denken Sie daran Anfrage = Antwort, in HTTP wird immer so sein, dass ein Antrag nur eine Antwort sein kann. Und die Antwort passiv ist, kann es nicht starten.

Für websocket, die während des Handshakes aufgebauten Verbindungen auf der Basis von HTTP, kann der Server die Initiative ergreifen, Daten an den Client zu senden.

Warum Gebrauch websocket

Nun, viele Websites , um den Daten - Updates auf der Seite, die alle von Ajax - Technologie zu erreichen Abfrage ziehen Daten an den Server. Polling in bestimmten Zeitintervallen (beispielsweise alle 1 Sekunde), gibt eine HTTP - Anforderung an den Server von dem Browser, und gibt die aktuellen Daten von dem Server an den Client - Browser. Das traditionelle Modell bringt offensichtlichen Nachteil , dass der Browser ständige Anforderung an den Server erfordert jedoch HTTP - Anfragen können einen langen Kopf enthalten, die wirklich effektive Daten nur ein kleiner Teil sein können, offensichtlich werden dieser Abfall viel Bandbreite Ressourcen.

Die relativ neue Technologie der Umfrageergebnisse sind zu tun , Comet ). Comet Polling - Technologie kann in lange und Streaming unterteilt werden. Verbesserte Technik lange Polling Polling oben beschrieben, die unnötige Anforderung zu reduzieren. Es wird die Ablaufzeit eingestellt einige der Daten, wenn die Daten vor dem Senden der Anfrage an den Server abgelaufen ist, die Daten für einen solchen Mechanismus nicht besonders häufige Änderungen der Umstände. Streaming in der Regel bezieht sich der Client ein ausgeblendetes Fenster und Server zu verwenden , um eine HTTP lange Verbindung herzustellen, wird der Server weiterhin den Verbindungsstatus aktualisieren , um am Leben zu halten HTTP lange Verbindung; dies der Fall ist, kann der Server, über diese lange Verbindung aktiv Daten gesendet an den Client; gleichzeitige Streaming - Technologie in einer großen Umgebung, können Sie die Leistung des Servers testen. Beiden Technologien basieren auf Anfrage - Antwort - Modus nicht betrachtet als Echtzeit - Technologie im wahrsten Sinne, jedes Mal , wenn sie fordern, Antwort, einigen Verkehr auf den gleichen Header - Informationen verschwendete und Entwicklungsaufwand ist auch groß .

In diesem Fall wird HTML5 WebSocket-Protokoll definiert ist, besser in der Lage Server-Ressourcen und Bandbreite zu sparen, und kann mehr Echtzeit-Kommunikation sein.

Websocket Verwendung ws WSS oder uniform resource identifier, ähnlich wie HTTPS, die Websocket WSS über den TLS darstellt. Wie zum Beispiel:

ws://example.com/wsapi
wss://secure.example.com/

verwenden WebSocket die gleiche TCP und HTTP-Port, können Sie Bypass meisten Firewalls beschränken. Standardmäßig verwendet Websocket Protokoll-Port 80, laufen bei über TLS, 443 den Standardanschluss verwendet.

WebSocket wird derzeit von der W3C standardisiert. WebSocket wurde von Firefox 4, Chrome, Opera 10.70 und Safari 5 und anderen Browsern unterstützt.

Eine typische Handshake-Anforderung von websocket

  • Client-Anfragen:
GET / HTTP / 1.1 - 
Upgrade: websocket 
Anschluss: Upgrade - 
Host: example.com 
Herkunft: http: // example.com 
Sec-WebSocket-Key: sN9cRrP / n9NdMgdcy2VJFQ == 
Sec -WebSocket-Version: 13
  • Server-Antwort:
HTTP / 1.1  101 Switching Protocols 
Upgrade: websocket 
Anschluss: Upgraden 
Sec -WebSocket-Accept: fFBooB7FAkLlXgRSz0BT3v4hq5s = 
Sec -WebSocket-Location: ws: // example.com/ 
字段说明

Feld Beschreibung

  • Der Anschluss muss eingestellt werden Mittel für ein Upgrade, dass der Kunde ein Upgrade verbinden möchte.
  • Upgrade-Feld muss Websocket gesetzt werden, den Wunsch geäußert, zu Websocket Vereinbarung zu aktualisieren.
  • Sec-WebSocket-Key ist eine zufällige Zeichenfolge, der Server diese Daten verwendet, wird eine Meldung von SHA-1 verdauen zu konstruieren. Die "Sec-WebSocket-Key" plus eine spezielle Zeichenfolge "258EAFA5-E914-47DA-95cA-C5AB0DC85B11" und SHA-1-Digest berechnet wird, gefolgt von einer Base-64-codiert, das Ergebnis als „Sec-WebSocket-Accept „Header-Wert wird an den Client zurückgegeben. Dadurch ist es möglich, fälschlicherweise für normale HTTP-Anforderung zu vermeiden, ist Websocket Protokoll.
  • Sec-WebSocket-Version von Support Websocket Version. RFC6455 erfordert Version 13, Version des Entwurfs vor wird aufgegeben.
  • Origin Feld ist optional, in der Regel repräsentieren verwendet, um diese Websocket Verbindung liegt in dem Browser, ähnlich die Referer Seite zu initiieren. Allerdings ist der Unterschied Referer, Origin enthält nur das Protokoll und Hostnamen.
  • Andere Felder im HTTP-Protokoll definiert, wie Cookies, etc., können auch in Websocket verwendet werden.

Wie verwenden websocket

Websocket auf , wie die Technologie in einer Vielzahl von Möglichkeiten , Python Backend verwenden, können Sie auf den Artikel verweisen „Python mehr Möglichkeiten der Verwendung von websocket“ https://jingniao.github.io/2016/04/10/python-websocket/

Unsere Projekte werden mit dem Django Framework, diesmal ich Praxis dwebsocket ausklappen um Djangos großen Platten websocket Stecker.

Installation dwesocket

Mann von wenigen Worten gesagt, pip Dafa.

pip installieren dwesocket

Verwendung

Wenn Sie eine Ansicht anzeigen möchten können sowohl HTTP - Anfragen verarbeiten kann die Anforderung websocket verarbeitet werden, nur um zu sehen dies ist eine dekorative Funktion  @accept_websocket Paket kann. auch verwendet werden können  , @require_websocket Dekorateur, WebSocket so Diese Ansicht akzeptiert erlaubt nur die Anforderung, wird eine normale HTTP - Anforderung zurückgewiesen.

Wenn Sie in Ihrer Anwendung Unterstützung für alle websocket Anforderungs - URL zur Verfügung stellen möchten, können Sie die Middleware verwenden. Nur müssen Sie dwebsocket.middleware.websocketmiddleware das Add einstellen  MIDDLEWARE_CLASSES das. (Wenn Sie nicht selbst definieren müssen, wird einen Fehler nicht definieren, das ist ein wenig umständlich, für diese Optimierung, ich habe einen Master - Kuti - Pull - Request , Autoren noch Hoffnung halten ....)

MIDDLEWARE_CLASSES = [ ' dwebsocket.middleware.WebSocketMiddleware ' ]

Wenn jede einzelne Ansicht websocket Anfrage Annahme erlaubt, sofern die Einstellungen  WEBSOCKET_ACCEPT_ALL für die  True.

WEBSOCKET_ACCEPT_ALL = True

Interface und Eigentum

  1. request.is_websocket ()

    Wenn die Anforderung websocket gibt Wahr zurück, wenn eine gewöhnliche HTTP-Anforderung Falsch zurück ist, können sie durch dieses Verfahren unterschieden werden.

  2. request.websocket

    Nach einer Anfrage websocket zu etablieren, wird diese Anforderung eine websocket Eigenschaft hat, dass der Kunde eine einfache API-Kommunikation bietet, wenn request.is_websocket () falsch ist, wird diese Eigenschaft keine sein.

  3. WebSocket.wait ()

    Gibt eine Nachricht von einem Client gesendet, wird er keinen Wert zurück, bevor der Client die Verbindung schließt, in diesem Fall das Verfahren kehrt None

  4. WebSocket.read ()

    Wenn Sie nicht über eine neue Nachricht von einem Client empfängt, Methode gibt eine neue Nachricht lesen, wenn nicht, wird nicht zurückkehren. Dies ist eine nicht-blockierende alternative Methode Warte

  5. WebSocket.count_messages ()

    Gibt die Anzahl der Nachrichten-Warteschlange

  6. WebSocket.has_messages ()

    Wenn Sie eine neue Nachricht haben gibt True zurück, sonst Falsch

  7. WebSocket.send (Meldung)

    Senden Sie eine Nachricht an den Client

  8. WebSocket.iter ()

    websocket Iterator

Praxis-Routinen

Empfangen einer Nachricht von dem Client, sendet er die Nachricht an den Client zurück und in der Nähe der Verbindung (über die Sicht nach hinten):

von dwebsocket import require_websocket 

@require_websocket 
def echo (Anfrage): 
    Nachricht = request.websocket.wait () 
    request.websocket.send (message)

Wir können auch den Server machen nicht automatisch schließt die Verbindung, die folgende Routine, der Server den Client sendet eine Nachricht zurück an Klein senden, und erhöhen die allgemeine Antwort von HTTP-Anfragen, tun die gleiche Operation kehrt:

von django.http import Httpresponse
 von dwebsocket Import accept_websocket 

def modify_message (Nachricht): 
    return message.lower () 

@accept_websocket 
def LOWER_CASE (Anfrage): 
    wenn nicht request.is_websocket (): #普通HTTP请求
        Nachricht = request.GET [ ' Nachricht ' ] 
        Nachricht = modify_message (Nachricht)
         zurückkehren Httpresponse (Nachricht)
     sonst : # websocket请求
         für Nachricht in request.websocket: 
            Nachricht = modify_message (Meldung)
            request.websocket.send (message)

Ändern dwebsocket Backend

Dwebsocket unterstützt derzeit zwei Back-End bzw. Ausfall- und uwsgi.

Standard Standard Unterstützung für Django Entwicklungs-Server selbst, eventlent, GEVENT und gunicore.

Wenn Sie uwsgi Backend verwenden möchten, fügen Sie WEBSOCKET_FACTORY_CLASS in settings.py Datei:

WEBSOCKET_FACTORY_CLASS = ' dwebsocket.backends.uwsgi.factory.uWsgiWebSocketFactory '

Führen uwsgi:

uwsgi --http: 8080 --http-WebSockets --processes 1 \
 --wsgi-Datei wsgi.py-- async  30 --ugreen --http-timeout 300

websocket Vor- und Nachteile

Vorteil

  • Header-Informationen ausgetauscht zwischen dem Client und der Server ist sehr klein, nur etwa 2 bis 10 Bytes (Paketlänge und damit verbundene);

  • Der Client und Server können die Initiative ergreifen, Daten miteinander zu übertragen;

  • Verwenden Sie keine TCP Anfrage Frequenz und die Zerstörung der Anfrage erstellen, Netzwerkbandbreiten-Ressourcen zu reduzieren, während der Server-Ressourcen zu sparen;

  • Weitere Echtzeit. Da das Protokoll Vollduplex ist, so kann der Server die Initiative ergreifen, Daten an den Client jederzeit zu senden. Im Hinblick auf die Notwendigkeit, für HTTP zu warten, vom Client initiiert fordert fordert der Server zu reagieren, deutlich weniger verzögert;

  • Bessere binäre Unterstützung. Websocket definiert Binärrahmen relativ HTTP, kann leichter binären Inhalt verarbeiten;

  • Sie können die Erweiterung unterstützen. WebSocket ein erweiterte definieren, kann der Benutzer das Protokoll erweitern, um einen benutzerdefinierten Unterprotokollabschnitt zu implementieren. Als Teil der Browser Stützen Kompression und so weiter.

Mangel

Die folgende fast die Erkenntnis, ist die Vorteile geschmacklos Nachteil, dass der Entwickler nicht hohe technische Anforderungen Nachteil, gibt es immer eine neue technisches Verfahren Beliebtheit.

Front-End-Entwickler:

  • Dazu tendiert, die Fähigkeit zu haben, datengesteuerte Javascript zu verwenden, und die Notwendigkeit, ws Verbindung aufrecht zu erhalten (sonst kann die Nachricht nicht drücken)

Für den Back-End-Entwickler:

  • Zunächst werden die langen Verbindungscode Bedürfnisse zu Back-End-Verarbeitung Geschäft ist stabiler (Do nicht setzen Prozesse und Frameworks abstürzen off)

  • Zwei Push-Nachricht ist relativ komplex

  • Drittens ist es unter vielen reifen http ökologischen Komponenten wiederverwendet werden können, WebSocket relativ neu

Referenzmaterial

Ich denke du magst

Origin www.cnblogs.com/miaoweiye/p/12509868.html
Empfohlen
Rangfolge