Principes et utilisation des websocket

Qu'est-ce que websocket

WebSocket effectuée sur une seule connexion TCP un full-duplex communication de protocole. WebSocket permet l' échange de données entre le client et le serveur plus facile, ce qui permet au serveur pousser activement des données au client. Dans l'API WebSocket, le navigateur et le serveur n'a besoin que de terminer une poignée de main, vous pouvez directement créer une connexion persistante entre les deux, et la transmission de données dans les deux sens.

protocole Websocket est persistante, par rapport à une telle HTTP non persistante est le protocole.

Par exemple:

cycle de vie défini par HTTP Request, qui envoie une demande, recevoir une réponse, puis HTTP1.0 dans la requête HTTP est terminée

HTTP1.1 l'amélioration de ce keep-alive, qui est, dans une connexion HTTP peut être envoyé plusieurs de la demande, la réception d'une réponse de la pluralité. Mais rappelez-vous en demande HTTP sera toujours ainsi, = réponse, qu'une demande peut être qu'une seule réponse. Et la réponse est passive, il ne peut pas initier.

Pour websocket, les liens établis lors de la négociation sur la base du protocole HTTP, le serveur peut prendre l'initiative d'envoyer des données au client.

Pourquoi utiliser websocket

Maintenant, de nombreux sites afin d'obtenir les mises à jour de données sur la page, tous par la technologie ajax polling extrait des données sur le serveur. Relève à certains intervalles de temps (par exemple, tous les 1 seconde), émet une demande HTTP au serveur par le navigateur, et renvoie les dernières données du serveur au navigateur client. Ce modèle traditionnel apporte inconvénient évident que le navigateur nécessite la demande constante au serveur, cependant, les requêtes HTTP peuvent contenir une tête longue, dont les données réellement efficaces ne peuvent être qu'une petite partie, évidemment , cela va perdre beaucoup de ressources de bande passante.

La technologie relativement nouvelle pour faire les résultats du sondage sont Comet ). La technologie de vote Comet peut être divisé en long et en continu. Amélioration de longue technique de sondage de sondages décrit ci - dessus, ce qui réduit la demande inutile. Il fixera le délai d'expiration de certaines données, lorsque les données ont expiré avant d' envoyer la demande au serveur, les données d'un tel mécanisme n'est pas particulièrement des changements fréquents de circonstances. Streaming fait généralement le client à utiliser une fenêtre cachée et serveur pour établir une connexion à long HTTP, le serveur continuera de mettre à jour l'état de connexion pour maintenir HTTP connexion longue vie, ce qui est le cas, le serveur peut, grâce à cette connexion longue données actives envoyé au client, la technologie de streaming simultané dans un grand environnement, vous pouvez tester les performances du serveur. Les deux technologies sont basées sur la demande - mode de réponse, non considéré comme la technologie en temps réel dans le vrai sens, chaque fois qu'ils demandent, la réponse, gaspillé une partie du trafic sur les mêmes informations d' en- tête et la complexité du développement est aussi grande .

Dans ce cas, le protocole HTML5 WebSocket est défini, mieux en mesure d'économiser les ressources du serveur et la bande passante, et peut être plus de communication en temps réel.

utilisation de Websocket ws WSS ou un identificateur de ressource uniforme, semblable à HTTPS, ce qui représente Websocket WSS sur TLS. Tels que:

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

Websocket utiliser le même port TCP et HTTP, vous pouvez contourner la plupart des pare-feu limite. Par défaut, le protocole Websocket utilise le port 80, à exécuter sur TLS, 443 en utilisant le port par défaut.

WebSocket est actuellement standardisé par le W3C. WebSocket a été pris en charge par Firefox 4, Chrome, Opera 10.70 et Safari 5 et d'autres navigateurs.

Une demande de poignée de main typique de websocket

  • Les demandes des clients:
GET / HTTP / 1.1 
Mise à jour: websocket 
Connexion: Mise à niveau 
hôte: example.com 
Origine: http: // example.com 
Sec-WebSocket-clé: sN9cRrP / n9NdMgdcy2VJFQ == 
Sec -WebSocket-Version: 13
  • Réponse du serveur:
HTTP / 1.1  101 Commutation Protocoles de 
mise à niveau: websocket 
Connexion: Mise à niveau 
Sec -WebSocket-Accept: fFBooB7FAkLlXgRSz0BT3v4hq5s = 
Sec -WebSocket-Lieu: ws: // example.com/ 
字段说明

description champ

  • La connexion doit être réglé sur la mise à niveau, des moyens que le client souhaite se connecter à mettre à niveau.
  • champ de mise à niveau doit être Websocket, a exprimé le souhait de passer à un accord Websocket.
  • Sec-WebSocket-Key est une chaîne aléatoire, le serveur utilisera ces données pour construire un condensé de message SHA-1. Le "Sec-WebSocket-clé" en plus d'une chaîne spéciale "258EAFA5-E914-47DA-95CA-C5AB0DC85B11", et SHA-1 produit de digestion est calculée, suivie d'une base 64 codant pour le résultat comme « Sec-WebSocket-Accept « valeur d'en-tête est renvoyée au client. Ainsi, il est possible d'éviter confondu requête HTTP normale est le protocole Websocket.
  • Sec-WebSocket-version de la version support Websocket. RFC6455 nécessite la version 13, version du projet avant est abandonné.
  • champ d'origine est facultative, généralement utilisé pour représenter lancer cette connexion réside WebSocket page dans le navigateur, similaire au Referer. Cependant, la différence est Referer, origine ne contient que le nom du protocole et l'hôte.
  • D'autres champs définis dans le protocole HTTP, tels que des cookies, etc., peuvent également être utilisés dans Websocket.

Comment utiliser websocket

Websocket sur la façon d'utiliser la technologie dans une variété de façons d'arrière - Python, vous pouvez vous référer à l'article « python plusieurs façons d'utiliser websocket » https://jingniao.github.io/2016/04/10/python-websocket/

Nos projets utilisent le framework Django, cette fois déplié de dwebsocket I pratique autour de grands websocket fiche d'enregistrement de Django.

Installation dwesocket

Homme de peu de mots dit, pépin Dafa.

pip installer dwesocket

utilisation

Si vous souhaitez afficher une vue peut gérer à la fois les requêtes HTTP, la demande peut être traitée websocket, juste pour voir c'est une fonction décorative  @accept_websocket peut paquet. Peut également être utilisé  @require_websocket décorateur, si Websocket Ce point de vue permet accepte que la demande sera rejetée une requête HTTP normale.

Si vous souhaitez fournir un soutien pour toutes les URL de demande de websocket dans votre application, vous pouvez utiliser le middleware. Seulement besoin de dwebsocket.middleware.websocketmiddleware définir l'ajouter à  MIDDLEWARE_CLASSES la. (Si vous n'avez pas besoin de se définir, ne définira pas une erreur, c'est un peu gênant, car cette optimisation, j'ai un maître Kuti Pull demande , les auteurs maintiennent toujours l' espoir ....)

MIDDLEWARE_CLASSES = [ ' dwebsocket.middleware.WebSocketMiddleware ' ]

Si chaque vue individuel permet l' acceptation de la demande de websocket, les paramètres fournis  WEBSOCKET_ACCEPT_ALL pour la  True.

WEBSOCKET_ACCEPT_ALL = True

Interface et propriété

  1. request.is_websocket ()

    Si la demande est retourne WebSocket vrai, si un rendement de requête HTTP ordinaires Faux, ils peuvent être distingués par cette méthode.

  2. request.websocket

    Après une demande d'établissement websocket, cette demande aura une propriété websocket que le client fournit une simple communication api, si request.is_websocket () est faux, cette propriété sera Aucun.

  3. WebSocket.wait ()

    Renvoie un message envoyé par un client, il ne reviendra pas de valeur avant que le client ferme la connexion, dans ce cas, la méthode renvoie Aucun

  4. WebSocket.read ()

    Si sinon, vous ne reçoit pas un nouveau message d'un client, lisez méthode renvoie un nouveau message, ne reviendra pas. Ceci est une autre méthode non bloquante attente

  5. WebSocket.count_messages ()

    Retourne le numéro de la file d'attente de messages

  6. WebSocket.has_messages ()

    Si vous avez un nouveau message renvoie Vrai, sinon Faux

  7. WebSocket.send (message)

    Envoyer un message au client

  8. WebSocket.iter ()

    websocket iterator

routines de pratique

Réception d'un message du client, il renvoie le message au client et fermer la connexion (à l'arrière de vue):

de require_websocket import dwebsocket 

@require_websocket 
def echo (demande): un 
    message = request.websocket.wait () 
    request.websocket.send (message)

Nous pouvons également faire le serveur ne se ferme pas automatiquement la connexion, la routine suivante, le serveur envoie au client d'envoyer un message de retour en minuscules, et d'augmenter la réponse générale des demandes HTTP, faire les mêmes déclarations d'opération:

d' importation django.http HttpResponse
 de accept_websocket import dwebsocket 

def modify_message (message): 
    retour message.lower () 

@accept_websocket 
def lower_case (demande): 
    si pas request.is_websocket (): #普通HTTP请求 un 
        message = request.GET [ ' un message ' ] un 
        message = modify_message (message)
         retour HttpResponse (message)
     autre : # websocket请求
         pour un message à request.websocket: un 
            message = modify_message (message)
            request.websocket.send (message)

Changement backend dwebsocket

Dwebsocket soutient actuellement deux arrière-plan, respectivement, par défaut et uwsgi.

support par défaut par défaut pour le serveur de développement de Django lui-même, eventlent, gevent et gunicore.

Si vous voulez utiliser backend uwsgi, ajoutez WEBSOCKET_FACTORY_CLASS dans le fichier settings.py:

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

Exécutez uwsgi:

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

avantages et inconvénients WebSocket

avantage

  • des informations d'en-tête échangées entre le client et le serveur est très faible, seulement environ 2 à 10 octets (longueur de paquet et apparentés);

  • Le client et le serveur peut prendre l'initiative de transmettre les uns aux autres données;

  • Ne pas créer une fréquence de requêtes TCP et la destruction de la demande, ce qui réduit les ressources de bande passante réseau, tout en économisant les ressources du serveur;

  • Plus en temps réel. Étant donné que le protocole est en duplex intégral, de sorte que le serveur peut prendre l'initiative d'envoyer des données au client à tout moment. En ce qui concerne la nécessité d'attendre des requêtes HTTP initiées par le client demande au serveur de répondre, retardé beaucoup moins;

  • Meilleure prise en charge binaire. Websocket défini trame binaire, HTTP relative, peut plus facilement manipuler le contenu binaire;

  • Vous pouvez soutenir l'expansion. Websocket définir une étendue, l'utilisateur peut étendre le protocole pour mettre en oeuvre une section de sous-protocole personnalisé. Dans le cadre du navigateur prend en charge la compression et ainsi de suite.

défaut

Ce qui suit presque la perspicacité, les avantages désavantage insipide est que le développeur ne défavorise pas élevé exigences techniques, il y a toujours une nouvelle popularité de processus technique.

Les développeurs front-end:

  • Ont tendance à avoir la possibilité d'utiliser javascript basées sur des données et la nécessité de maintenir la connexion ws (sinon le message ne peut pas pousser)

Pour les développeurs de back-end:

  • Tout d'abord, les besoins à long code de connexion pour les entreprises de traitement back-end est plus stable (Ne pas mettre les processus et les cadres hors écrasent)

  • Deux message push est relativement complexe

  • En troisième lieu, il est sous beaucoup de maturité http composants écologiques peuvent être réutilisés, Websocket relativement nouveau

Documents de référence

Je suppose que tu aimes

Origine www.cnblogs.com/miaoweiye/p/12509868.html
conseillé
Classement