HTML5 WebSocket
WebSocket ist ein Protokoll, das HTML5 für Vollduplex-Kommunikation über eine einzelne TCP-Verbindung bereitzustellen begann.
WebSocket vereinfacht den Datenaustausch zwischen Client und Server und ermöglicht es dem Server, Daten aktiv an den Client zu pushen. In der WebSocket-API müssen Browser und Server nur einen Handshake abschließen, danach können sie direkt eine persistente Verbindung aufbauen und eine bidirektionale Datenübertragung durchführen.
In der WebSocket-API müssen Browser und Server nur eine Handshake-Aktion ausführen, und dann wird ein schneller Kanal zwischen Browser und Server gebildet. Danach können beide direkt Daten untereinander übertragen.
Heutzutage verwenden viele Websites Ajax-Polling, um Push-Technologie zu implementieren. Beim Polling sendet der Browser in bestimmten Zeitintervallen (z. B. jede Sekunde) HTTP-Anfragen an den Server, und der Server gibt dann die neuesten Daten an den Browser des Clients zurück. Dieses traditionelle Modell hat offensichtliche Nachteile: Der Browser muss kontinuierlich Anfragen an den Server senden. HTTP-Anfragen können jedoch lange Header enthalten, und die tatsächlich gültigen Daten machen möglicherweise nur einen sehr kleinen Teil aus, was offensichtlich viel Bandbreite und andere Ressourcen verschwendet.
Das von HTML5 definierte WebSocket-Protokoll kann Serverressourcen und Bandbreite besser sparen und kann in größerem Umfang in Echtzeit kommunizieren.

Der Browser sendet über JavaScript eine Anfrage an den Server, um eine WebSocket-Verbindung aufzubauen. Nachdem die Verbindung hergestellt ist, können Client und Server direkt Daten über die TCP-Verbindung austauschen.
Wenn Sie eine WebSocket-Verbindung erlangt haben, können Sie diesend()-Methode verwenden, um Daten an den Server zu senden, und dasonmessage-Ereignis verwenden, um vom Server zurückgegebene Daten zu empfangen.
Die folgende API wird verwendet, um ein WebSocket-Objekt zu erstellen.
var Socket = new WebSocket(url, [protocol] );
Im obigen Code gibt der erste Parameter url die URL der Verbindung an. Der zweite Parameter protocol ist optional und gibt die akzeptablen Subprotokolle an.
WebSocket-Eigenschaften
Die folgenden sind die Eigenschaften des WebSocket-Objekts. Angenommen, wir haben das Socket-Objekt mit dem obigen Code erstellt:
| Eigenschaft | Beschreibung |
|---|---|
| Socket.readyState | Schreibgeschütztes AttributreadyStateGibt den Verbindungsstatus an, der folgende Werte annehmen kann:
|
| Socket.bufferedAmount | Schreibgeschütztes AttributbufferedAmountDie Anzahl der UTF-8-Textbytes, die durch send() in die Warteschlange für die Übertragung gestellt wurden, aber noch nicht gesendet worden sind. |
WebSocket-Ereignisse
Im Folgenden werden die zugehörigen Ereignisse des WebSocket-Objekts beschrieben. Angenommen, wir haben das Socket-Objekt mit dem obigen Code erstellt:
| Ereignis | Event-Handler | Beschreibung |
|---|---|---|
| open | Socket.onopen | Wird ausgelöst, wenn die Verbindung hergestellt wird |
| message | Socket.onmessage | Wird ausgelöst, wenn der Client Daten vom Server empfängt |
| error | Socket.onerror | Wird ausgelöst, wenn ein Kommunikationsfehler auftritt |
| close | Socket.onclose | Wird ausgelöst, wenn die Verbindung geschlossen wird |
WebSocket-Methoden
Im Folgenden sind die zugehörigen Methoden des WebSocket-Objekts aufgeführt. Angenommen, wir haben das Socket-Objekt mit dem obigen Code erstellt:
| Methode | Beschreibung |
|---|---|
| Socket.send() | Daten über die Verbindung senden |
| Socket.close() | Schließen Sie die Verbindung |
WebSocket-Beispiele
Das WebSocket-Protokoll ist im Wesentlichen ein TCP-basiertes Protokoll.
Um eine WebSocket-Verbindung herzustellen, muss der Client-Browser zunächst eine HTTP-Anfrage an den Server initiieren. Diese Anfrage unterscheidet sich von einer regulären HTTP-Anfrage und enthält einige zusätzliche Header-Informationen. Der zusätzliche Header "Upgrade: WebSocket" zeigt an, dass es sich um eine HTTP-Anfrage handelt, die eine Protokollaktualisierung beantragt. Der Server analysiert diese zusätzlichen Header-Informationen und generiert eine Antwortnachricht, die an den Client zurückgegeben wird. Die WebSocket-Verbindung zwischen Client und Server wird dann hergestellt, und beide Parteien können frei Informationen über diesen Verbindungskanal austauschen. Diese Verbindung bleibt bestehen, bis entweder der Client oder der Server die Verbindung aktiv schließt.
Clientseitiges HTML und JavaScript
Derzeit unterstützen die meisten Browser die WebSocket()-Schnittstelle. Sie können das Beispiel in den folgenden Browsern ausprobieren: Chrome, Mozilla, Opera und Safari.
Inhalt der Datei example_websocket.html
<!DOCTYPE HTML>
<html>
<head>
<meta charset="utf-8">
<title>Example(example.com)</title>
<script type="text/javascript">
function WebSocketTest()
{
if ("WebSocket" in window)
{
alert("您的浏览器支持 WebSocket!");
// 打开一个 web socket
var ws = new WebSocket("ws://localhost:9998/echo");
ws.onopen = function()
{
// Web Socket 已连接上,使用 send() 方法发送数据
ws.send("发送数据");
alert("数据发送中...");
};
ws.onmessage = function (evt)
{
var received_msg = evt.data;
alert("数据已接收...");
};
ws.onclose = function()
{
// 关闭 websocket
alert("连接已关闭...");
};
}
else
{
// 浏览器不支持 WebSocket
alert("您的浏览器不支持 WebSocket!");
}
}
</script>
</head>
<body>
<div id="sse">
<a href="WebSocketTest().html">运行 WebSocket</a>
</div>
</body>
</html>
pywebsocket installieren
Bevor wir das obige Programm ausführen, müssen wir einen Dienst erstellen, der WebSocket unterstützt. Laden Sie mod_pywebsocket vonpywebsocketherunter, oder verwenden Sie den git-Befehl zum Herunterladen:
git clone https://github.com/googlearchive/pywebsocket <p> mod_pywebsocket 需要 python 环境支持</p> mod_pywebsocket 是一个 Apache HTTP 的 Web Socket扩展,安装步骤如下:</p> <ul> <li><p>解压下载的文件。</p></li> <li><p>进入 <b>pywebsocket</b> 目录。</p></li> <li><p>执行命令:</p> <pre>$ python setup.py build $ sudo python setup.py install
Dokumentation anzeigen:
$ pydoc mod_pywebsocket
Dienst starten
Führen Sie im Verzeichnispywebsocket/mod_pywebsocketden folgenden Befehl aus:
$ sudo python standalone.py -p 9998 -w ../example/
Der obige Befehl startet einen Dienst mit der Portnummer 9998; mit -w wird das Verzeichnis festgelegt, in dem sich der Handler echo_wsh.py befindet.
Nun können wir die zuvor erstellte Datei example_websocket.html im Chrome-Browser öffnen. Wenn Ihr Browser WebSocket() unterstützt, klicken Sie auf "Run WebSocket", und Sie sehen Pop-up-Fenster für jeden Schritt des gesamten Prozesses. GIF-Demonstration des Prozesses:
Nachdem wir den Dienst gestoppt haben, erscheint "Connection closed...".
Weitere Erweiterungen