Übersetzen Sie

Translate to EnglishÜbersetzen Sie zum Deutsch/GermanΜεταφράστε στα ελληνικά/GreekПереведите к русскому/RussianOversetter til Norsk/NorwegianÖversätta till Svensk/Swedishहिनà¥à¤¦à¥€ अनà¥à¤µà¤¾à¤¦ करने के लिà¤/Hindi
Tradueix al català/CatalanTulkot uz latviešu/LatvianPreložiť do slovenčiny/SlovakVertaal aan het Nederlands/Dutchترجمة الى العربية/ArabicTraduzca al Español/SpanishTraduisez au Français/French
Traduca ad Italiano/ItalianTraduza ao Português/Portuguese日本語に翻訳しなさい /Japanese한국어에게 번역하십시오/Korean中文翻译/Chinese Simplified中文翻译/Chinese TraditionalПереклад на українську/Ukrainian
Bild der androiden drahtlosen Anwendungsentwicklung
Bild von Betriebssystemkonzepten
Bild der modernen Betriebssysteme (3. Ausgabe)
Bild des Beginns von Google Maps API 3

WSGI, GEvent und Netz-Einfaßungen

Netz-Einfaßungen ist eine auftauchende Technologie, die den bidirektionalen, full-duplex Kommunikationskanälen ermöglicht, über einer einzelnen TCP- Einfaßung. Sie war ursprünglich entworfen, in den Netzbrowsern und -web server eingeführt zu werden, aber sie kann durch jede mögliche Klienten- oder Bedieneranwendung verwendet werden. Tests haben Netz-Einfaßungen können eine 500:1verkleinerung im Netzverkehr und 3:1verkleinerung in der Latenz zur Verfügung stellen gezeigt.

Netz-Einfaßungen sind herum in der einen oder anderen Form seit 2009 gewesen. Jedoch werden Spezifikationen noch nicht noch völlig gekocht. Die W3C Web-Anwendungs-Gruppe ist für die Normung des WebSocket API verantwortlich. Der Herausgeber des W3C TR ist Ian Hickson, der im Allgemeinen als der Erfinder der Netz-Einfaßungen angesehen wird. Einerseits entwickelt das WebSocket Protokoll noch und wird von der (Hypertext-Bidirektionalen) Arbeitsgruppe IETF-HyBi standardisiert. Der Herausgeber ist Ian Fette von Google Inc. übrigens, Vereinbarung über die Technologie ist gewesen nicht glatt, dort sind gewesen über 80 Entwürfen der Spezifikationen bis jetzt.

Gegründet auf Rückgespräch von den frühen Implementers, war das WebSocket Protokoll 2010 zu draft-ietf-hybi-thewebsocketprotocol-00 undatiert (alias draft-hixie-thewebsocketprotocol-76). Diese Version entspannte sich Anforderungen an den Händedruck, ihn einfacher zu bilden, mit HTTP-Bibliotheken einzuführen und die eingeführte nonce-gegründete vor Querprotokollangriffen zu schützen Anfechtenantwort, sich. Jedoch bildeten diese Änderungen das Protokoll inkompatibel mit der vorhergehenden Version, d.h. draft-hixie-thewebsocketprotocol-75. So arbeitet eine Implementierung des Protokolls -75 nicht mit einer Implementierung des Protokolls -76.

Ist hier die formale Definition des WebSocket API:

[Constructor(in DOMString url, optional in DOMString protocol)]
interface WebSocket {
readonly attribute DOMString URL;
// ready state
const unsigned short CONNECTING = 0;
const unsigned short OPEN = 1;
const unsigned short CLOSED = 2;
readonly attribute unsigned short readyState;
readonly attribute unsigned long bufferedAmount;  

// networking
attribute Function onopen;
attribute Function onmessage;
attribute Function onclose;
boolean send(in DOMString data);
void close();
};
WebSocket implements EventTarget;


Wir verwenden Javascript in den folgenden Beispielen, aber es gibt keinen Grund, den andere Sprachen wie Pythonschlange nicht mit Netz-Einfaßungen verwendet werden können.

Um an einen WebSocket Endpunkt anzuschließen, verursachen Sie einen neuen WebSocket Fall wie in dem folgenden Beispiel gezeigt. Alles, das Sie zur Verfügung stellen müssen, ist ein URL, das den Endpunkt darstellt, an den Sie anschließen möchten.

var myWS = new WebSocket("ws://www.fpmurphy.com");


Das WebSocket Protokoll spezifiziert das WS: /Präfix, zum von einem WebSocket und von wss anzuzeigen: /Präfix, zum eines sicheren (TLS) WebSocket Anschlußes anzuzeigen.

Ein WebSocket Anschluss wird durch ein Aufsteigen vom HTTP-Protokoll zum Netz-Einfaßungsprotokoll während des Anfangshändedrucks zwischen einem Klienten und einem Bediener, über dem gleichen zugrunde liegenden IP-Anschluss hergestellt. Sobald hergestellt, können WebSocket Datenfelder zwischen den Klienten und den Bediener im full-duplex Modus hin und her gesendet werden.

Vor der Verbindung an einen Endpunkt, können Sie Ereigniszuhörer verbinden, um jede Phase des Anschlusslebenszyklus wie in dem folgenden Beispiel gezeigt zu behandeln:

myWS.onopen = function(evt) { alert("Connection open ..."); };
myWS.onmessage = function(evt) { alert( "Received Message: " + evt.data); };
myWS.onclose = function(evt) { alert("Connection closed."); };


Mindestens benötigen Sie eine onmessage Ereigniszufuhr, wenn Sie Mitteilungen empfangen möchten.

Um eine Mitteilung zu senden, wenden Sie die sendenmethode an.

myWS.send("Hello World!");


Zu den Anschluss schließen:

 myWS.close();

An gevent jetzt sich wenden, das eine coroutine-gegründete Pythonschlangenetzwerkanschlußbibliothek ist, die greenlet verwendet , um eine hoch qualifizierte synchrone API auf die libevent oder libev Ereignisschleife vor kurzem zur Verfügung zu stellen. Gevent wird im Allgemeinen als eins des Besten angesehen, das heraus asynchrone Rahmen dort zurzeit durchführt. Es schließt zwei WSGI Bediener, d.h. wsgi.WSGIServer und pywsgi.WSGIServer mit ein.

Jeffrey Gelens hat eine WebSocket Bibliothek für die gevent Netzwerkanschlussbibliothek entwickelt. Im Folgenden Beispiel benutzen wir diese Bibliothek, um eine einfache Probe eines WebSocket ermöglichten web server zu entwickeln, das auf eine Mitteilung von einem Klienten reagiert, zurückschicken 100 nach dem Zufall erzeugte Zahlen zwischen 0 und 1, die, der Reihe nach auf einem Realzeitdiagramm vom Klienten angezeigt werden. Die meisten dieses Codes ist nicht Grube, ich zog sie einfach zusammen in dieses Beispiel.

Ist hier der Bedienercode:

#!/usr/bin/python

import os
import sys
import random
import threading
import webbrowser

from geventwebsocket.handler import WebSocketHandler
from gevent import pywsgi
import gevent

FILE = 'test.html'
PORT = 8000

def handle(ws):
    if ws.path == '/echo':
        while True:
            m = ws.wait()
            if m is None:
                break
            ws.send(m)
    elif ws.path == '/data':
        for i in xrange(100):
            ws.send("0 %s %s\n" % (i, random.random()))
            gevent.sleep(0.1)

def app(environ, start_response):
    if environ['PATH_INFO'] == '/test':
        start_response("200 OK", [('Content-Type', 'text/plain')])
        return ["Yes this is a test!"]
    elif environ['PATH_INFO'] == "/data":
        handle(environ['wsgi.websocket'])
    else:
        response_body = open(FILE).read()
        status = '200 OK'
        headers = [('Content-type', 'text/html'), ('Content-Length', str(len(response_body)))]
        start_response(status, headers)
        return [response_body]

def start_server():
    print 'Serving on http://127.0.0.1:%s' % (PORT)
    server = pywsgi.WSGIServer(('0.0.0.0', PORT), app,
             handler_class=WebSocketHandler)
    server.serve_forever()

def start_browser():
    def _open_browser():
        wb = webbrowser.get('/usr/bin/google-chrome %s')
        wb.open_new_tab('http://localhost:%s/%s' % (PORT, FILE))
    thread = threading.Timer(0.5, _open_browser)
    thread.start()

if __name__ == "__main__":
    print "version:", sys.version
    start_browser()
    start_server()


Wenn der Bediener angestellt wird, beginnt er zuerst einen Fall des Google-Chrombrowsers oder einen neuen Vorsprung, wenn ein Fall des Google-Chrombrowsers bereits läuft, in einem unterschiedlichen Gewinde der Durchführung. Der Browser zeigt dann die folgende Webseite (test.html) zum Benutzer an.

<!DOCTYPE html>
<html>
    <head>
        <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.1/jquery.min.js"></script>
        <script src="http://people.iola.dk/olau/flot/jquery.flot.js"></script>
        <script>
            $(document).ready(function() {
                 if ( typeof(WebSocket) != "function" ) {
                     $('body').html("<h2><center>ERROR: This browser does not support Web Sockets</center></h2>");
                 }
            });

            function plotnumbers() {
                var data = {};
                var s = new WebSocket("ws://localhost:8000/data");

                s.onopen = function() {
                    s.send('hi');
                };

                s.onmessage = function(e) {
                    var lines = e.data.split('\n');
                    for (var i = 0; i < lines.length - 1; i++) {
                        var parts = lines[i].split(' ');
                        var d = parts[0], x = parseFloat(parts[1]), y = parseFloat(parts[2]);
                        if (!(d in data)) data[d] = [];
                        data[d].push([x,y]);
                     }
                     var plots = [];
                     for (var d in data) plots.push( { data: data[d].slice(data[d].length - 200) } );
                     $.plot( $("#placeholder"), plots,
                     {
                         series: {
                             color: "rgba(255, 0, 0, 0.8)",
                             lines: { show: true,
                                      lineWidth: 5,
                                      fill: true,
                                      fillColor: "rgba(255, 162, 0, 0.6)"
                             },
                          },
                          yaxis: { min: 0 },
                     } );
                     s.send('');
                 };
            };
        </script>

    </head>
    <body>
         <center><h3>Plot of Random Numbers</h3><center>
         <div id="placeholder" style="width:600px;height:300px"></div>
         <br />
         <input type="submit" class="button" value="Start Plot" onClick="plotnumbers();" />
    </body>
</html>


Wenn der Benutzer den Planknopf bedrängt, wird ein WebSocket zwischen dem Browser verursacht und dem Bediener und 100 gelegentlichen Zahlen zwischen 0 und 100 werden zum Browser gesendet. Hier werden die Zahlen zu einem Format verarbeitet, das flot, eine populäre JavascriptPlot-Bibliothek für jQuery, versteht.

Wenn Sie den oben genannten Code überprüfen, sehen Sie, dass er zwei Javascriptfunktionen enthält. Die onload Funktionsüberprüfungen, zum zu garantieren, dass Sie ein WebSocket-ermöglichtes web browser verwenden. Wenn nicht, wird eine einfache Fehlermeldung angezeigt und nichts anderes tritt auf. Die plotnumbers Funktion erledigt die ganze tatsächliche Arbeit. Sie verursacht einen WebSocket Anschluss zum Bediener und verarbeitet die zurückgebrachten Zahlen in der s.onmessage Ereigniszufuhr. Die meisten des Codes hier bezieht auf dem Vorbereiten der Zahlen für Anzeige durch flot (sehen Sie $.plot ($ (#placeholder ")).

Ist hier ein Video des oben genannten Beispiels in der Tätigkeit. Dieses zeigt nicht in der aktuellen Version von Firefox an. Sie müssen einen WebM-gegründeten Browser wie Google-Chrom benutzen.

Übrigens wurde das Video unter Verwendung errichten-WebM im Videogerät im Gnome Shell hergestellt und das videoplayer ist der ausgezeichnete mediaplayer.js HTML5 Spieler, der einen Modus des Rückfalles non-HTML5 (den auch zur Verfügung stellen kann ich nicht ermöglicht habe).

Netz-Einfaßungen werden die Weise ändern, die web-basiert Anwendungen entwickelt und entfaltet werden. Z.B. bildet SocketStream, das ein auftauchender voller Realzeitstapel Single-page Rahmen der Anwendung (BADEKURORT) für Node.js ist, umfangreichen Gebrauch von den Netz-Einfaßungen.

Sie können ein tarball dieses Beispiels hier herunterladen. Gerade Download, packen und rufen test.py aus hervor, um es zu verwenden. Sie können ein ausfallen sehen, um ~/.pki/nssdb Verzeichnis zu verursachen. Fehlermeldung. Dieses ist eine Wanze im Chrom.

2 Anmerkungen zu WSGI, zu GEvent und zu den Netz-Einfaßungen

  • T Hansen

    Hallo. Ich wollte gerade Sie bitten, Ihr WIPS zu aktualisieren hinzufüge an für firefox. Es ist eine ehrfürchtige APP und ich habe nichts gefunden, das tut, was es tat. Ich finde, dass es wirklich störend, dass firefox sich heraus setzt, so schnell aktualisiert und dass sie den nicht rueckwaerts kompatibel mit Zusätzen bilden! So auch erklärt ihnen. Sowieso würde lieben, das WIPS addon gehalten lebendig zu sehen!

Lassen Sie eine Antwort