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é
-
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.
-
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.
-
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
-
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
-
WebSocket.count_messages ()
Retourne le numéro de la file d'attente de messages
-
WebSocket.has_messages ()
Si vous avez un nouveau message renvoie Vrai, sinon Faux
-
WebSocket.send (message)
Envoyer un message au client
-
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