Heim > Artikel > Backend-Entwicklung > Implementierung von PHP und WebSocket-Chatroom basierend auf dem Swoole_php-Beispiel
Websocket
Websocket ist nur ein Netzwerkkommunikationsprotokoll
Genau wie http, ftp usw. sind alles Netzwerkkommunikationsprotokolle; denken Sie nicht zu viel nach;
Die Beziehung zwischen WebSocket und HTTP
Es gibt Kreuzungen, aber nicht alle.
Vergleich von http- und Websocket-Anfrageheadern:
HTTP:
Der Client fordert den Server mit einem Brief über http (Reiten) an, überträgt aber gleichzeitig
(zwei Pipes), wenn der Server das WebSocket-Protokoll unterstützt (eine Schnittstelle mit zwei). Pipes) verwenden Das Websocket-Protokoll gibt verfügbare Informationen zurück (wobei das Pferd verworfen wird). Anschließend werden diese beiden Pipes für die Übertragung von Informationen verwendet, es sei denn, eine Partei unterbricht die Pipe künstlich, wenn der Server dies nicht unterstützt Fordern Sie den Link an und geben Sie eine Fehlermeldung zurück
Upgrade:websocket
Connection:Upgrade
Vergleich von http- und Websocket-Antwortheadern:
Der Unterschied zwischen Websocket, Ajax-Polling und Long-Poll
Das erste ist Ajax-Polling. Das Prinzip des Ajax-Pollings ist sehr einfach. Es ermöglicht dem Browser, alle paar Sekunden eine Anfrage zu senden, um den Server zu fragen, ob neue Informationen vorliegen
Szenenwiedergabe:
Kunde: La la la, gibt es neue Informationen (Anfrage)
Tatsächlich ähnelt das Prinzip der
Ajax-Abfrage. Sie verwenden beide Abfragen und werden hier nicht besprochen Wie aus dem oben Gesagten hervorgeht, wird beim Polling tatsächlich kontinuierlich eine HTTP-Verbindung hergestellt und dann darauf gewartet, dass der Server sie verarbeitet, was ein weiteres Merkmal des HTTP-Protokolls widerspiegeln kann: Passivität. Gleichzeitig verwirft der Server nach jeder HTTP-Anfrage und Antwort alle Client-Informationen. Die nächste Anfrage muss Identitätsinformationen (Cookie) enthalten, Stateless
;Das Aufkommen von Websocket hat diese Probleme ordentlich gelöst Das obige Szenario kann also wie folgt geändert werden.
Kunde: La la la, ich möchte ein Websocket-Protokoll einrichten, erforderliche Dienste: Chat, Websocket-Protokollversion: 17 (HTTP-Anfrage)
Kunde: Bitte leiten Sie es mir weiter, wenn Sie Informationen haben. .
Server: Ok, ich werde es dir manchmal sagen.
Kunde: Balab beginnt gegen Alabala zu kämpfen
Server: Sora Aoi
Kunde: Ich habe Nasenbluten, lass es mich abwischen...
Server: Haha Bull Education ist großartig, hahahaha
Server: Ich habe so heftig gelacht, haha
Swoole
Um jedoch PHP und HTML5 zum Vervollständigen einer WebSocket-Anfrage und -Antwort zu verwenden, bin ich durch Tausende von Bergen und Flüssen gelaufen und habe Swoole tief im dichten Wald gefunden:
Das asynchrone, parallele, leistungsstarke Netzwerkkommunikations-Framework der PHP-Sprache, geschrieben in reiner C-Sprache, bietet einen asynchronen Multithread-Server der PHP-Sprache, einen asynchronen TCP/UDP-Netzwerk-Client, asynchrones MySQL, einen Datenbankverbindungspool, AsyncTask, und Nachrichtenwarteschlange, Millisekunden-Timer, asynchrones Lesen und Schreiben von Dateien, asynchrone DNS-Abfrage.
Unterstützte Dienste:
WebSocket-Server
TCP-Server
TCP-Client
Async-IO (asynchron)
Aufgabe (geplante Aufgabe)
Umgebungsabhängigkeiten:
Unterstützt nur Linux, FreeBSD, MacOS und Typ-3-Betriebssysteme
Linux-Kernel-Version 2.3.32 oder höher
PHP5.3.10 oder höher
gcc4.4 oder höher oder clang
cmake2.4, Sie müssen cmake
verwenden, wenn Sie libswoole.so als C/C-Bibliothek kompilierenInstallation:
Sie müssen sicherstellen, dass die folgende Software im System vorhanden ist:
php-5.3.10 oder höher
gcc-4.4 oder höher
machen
Autoconf
Swoole läuft als PHP-Erweiterung
Installation (Root-Berechtigung):
cd swoole
phpize
./configure
machen
sudo make install
php.ini konfigurieren
extension=swoole.so
Für diejenigen, die Swoole lernen möchten, lesen Sie das Handbuch selbst (obwohl es nicht gut geschrieben ist, können Sie es trotzdem verstehen)
Erstellen Sie einen Chatraum
Serverseite: socket.php
//创建websocket服务器对象,监听0.0.0.0:9502端口 $ws = new swoole_websocket_server("0.0.0.0", 9502); //监听WebSocket连接打开事件 $ws->on('open', function ($ws, $request) { $fd[] = $request->fd; $GLOBALS['fd'][] = $fd; //$ws->push($request->fd, "hello, welcome\n"); }); //监听WebSocket消息事件 $ws->on('message', function ($ws, $frame) { $msg = 'from'.$frame->fd.":{$frame->data}\n"; //var_dump($GLOBALS['fd']); //exit; foreach($GLOBALS['fd'] as $aa){ foreach($aa as $i){ $ws->push($i,$msg); } } // $ws->push($frame->fd, "server: {$frame->data}"); // $ws->push($frame->fd, "server: {$frame->data}"); }); //监听WebSocket连接关闭事件 $ws->on('close', function ($ws, $fd) { echo "client-{$fd} is closed\n"; }); $ws->start();
Client: Socket.html
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <div id="msg"></div> <input type="text" id="text"> <input type="submit" value="发送数据" onclick="song()"> </body> <script> var msg = document.getElementById("msg"); var wsServer = 'ws://192.168.1.253:9502'; //调用websocket对象建立连接: //参数:ws/wss(加密)://ip:port (字符串) var websocket = new WebSocket(wsServer); //onopen监听连接打开 websocket.onopen = function (evt) { //websocket.readyState 属性: /* CONNECTING 0 The connection is not yet open. OPEN 1 The connection is open and ready to communicate. CLOSING 2 The connection is in the process of closing. CLOSED 3 The connection is closed or couldn't be opened. */ msg.innerHTML = websocket.readyState; }; function song(){ var text = document.getElementById('text').value; document.getElementById('text').value = ''; //向服务器发送数据 websocket.send(text); } //监听连接关闭 // websocket.onclose = function (evt) { // console.log("Disconnected"); // }; //onmessage 监听服务器数据推送 websocket.onmessage = function (evt) { msg.innerHTML += evt.data +'<br>'; // console.log('Retrieved data from server: ' + evt.data); }; //监听连接错误信息 // websocket.onerror = function (evt, e) { // console.log('Error occured: ' + evt.data); // }; </script> </html>
Das Obige ist der gesamte Inhalt der Implementierung von PHP- und WebSocket-Chatrooms auf Basis von Swoole. Ich glaube, dass dieser Artikel für jeden hilfreich sein wird, um PHP und WebSocket zu lernen und Chatrooms zu entwickeln.