Wie implementiert Workerman den Gruppenchat?
Dec 12, 2019 am 09:31 AM1. Grundlagen
1. Workerman
Workerman ist ein gewissenhaftes und leistungsstarkes PHP-Socket-Server-Framework, das von Chinesen entwickelt wurde. Es hat mehr als 4K-Sterne in gayHub, dem weltweit gr??ten Same-Server. Sex-Dating-Plattform. Sie k?nnen sich vorstellen, wie gro? das Vieh ist.
Es kann einzeln bereitgestellt oder in MVC-Frameworks (TP, Laravel usw.) integriert werden. Man kann sagen, dass es sehr praktisch ist und gute Parallelit?tseffekte hat.
Offizielle Website-Adresse:
http://www.workerman.net/workerman
Gayhub-Adresse:
https://github.com/ walkor /workerman/
2. Gateway-Worker
Gateway-Worker (im Folgenden als Gateway bezeichnet) ist ein auf Workerman basierendes TCP-Framework für lange Verbindungen, das verwendet wird um schnell eine TCP-Anwendung für lange Verbindungen zu entwickeln.
Online-Chats nutzen im Allgemeinen lange Verbindungen, um die Kommunikation aufrechtzuerhalten. Obwohl die Verwendung von Workerman den gleichen Effekt erzielen kann, ist das Gateway bequemer und schneller.
(Der durch Umfragen erstellte Chatroom war AUS, das ist er auch...)
Gayhub-Adresse:
https://github.com/walkor/GatewayWorker
3. GatewayClient
GateClient ist eine Komponente, die dazu dient, Mitarbeiter oder Gateways beim Gruppieren von Benutzern und beim Senden von Informationen an Benutzer zu unterstützen Original konvertieren Die System-UID und Client-ID sind gebunden.
Gayhub-Adresse:
https://github.com/walkor/GatewayClient
2. Theorie:
1. Prinzipien der Integration mit dem MVC-System:
·Bestehende MVC-Framework-Projekte und die unabh?ngige Bereitstellung von GatewayWorker beeintr?chtigen nicht untereinander ;
·Die gesamte Gesch?ftslogik wird durch Posten/Abrufen der Website-Seite in das MVC-Framework vervollst?ndigt;
· GatewayWorker akzeptiert keine Daten vom Client, das hei?t, GatewayWorker verarbeitet keine Gesch?ftslogik und GatewayWorker wird nur als unidirektionaler Push-Kanal verwendet
· Nur ??wenn das MVC-Framework Daten aktiv an den Browser pushen muss, wird die Gateway-API (GatewayClient) im MVC-Framework aufgerufen, um den Push abzuschlie?en.
2. Implementierungsschritte:
(1) Die Website-Seite stellt eine Websocket-Verbindung mit GatewayWorker her.
(2) GatewayWorker findet diese Seite initiiert eine Verbindung Wenn die client_id der entsprechenden Verbindung an die Website-Seite gesendet wird (3) Nachdem die Website-Seite die client_id empfangen hat, l?st sie eine Ajax-Anfrage aus (vorausgesetzt, es handelt sich um bind.php) und sendet die client_id an das MVC-Backend;
(4) Nach dem Empfang der client_id verwendet das mvc-Backend bind.php den GatewayClient, um Gateway::bindUid($client_id, $uid) aufzurufen, um die client_id an die aktuelle zu binden uid (Benutzer-ID oder eindeutige Client-ID). Wenn es eine Gruppen- oder Gruppensendefunktion gibt, k?nnen Sie auch Gateway::joinGroup($client_id, $group_id) verwenden, um die client_id zur entsprechenden Gruppe hinzuzufügen
(5) Alle von der Seite initiierten Anfragen sind direkt posten/an mvc senden Das Framework übernimmt die einheitliche Verarbeitung, einschlie?lich des Sendens von Nachrichten. (6) Wenn das MVC-Framework w?hrend der Gesch?ftsverarbeitung Daten an eine bestimmte UID oder Gruppe senden muss, ruft es direkt die GatewayClient-Schnittstelle auf Gateway::sendToUid Gateway::sendToGroup Warten Sie einfach, bis es gesendet wird.
3. Implementierung – Gateway konfigurieren und ?ffnen:
1. Gateway herunterladen und verwenden
Kann allein verwendet oder im ?ffentlichen Verzeichnis des Frameworks abgelegt werden.
2. Start.php bearbeiten·
start.php muss über die PHP-Befehlszeile ausgeführt werden. ·
Achten Sie auf den Pfad von require_onceini_set('display_errors', 'on');
use Workerman\Worker;
if(strpos(strtolower(PHP_OS), 'win') === 0)
{
exit("start.php not support windows, please use start_for_win.bat\n");
}
// 檢查擴(kuò)展
if(!extension_loaded('pcntl'))
{
exit("Please install pcntl extension.See http://doc3.workerman.net/appendices/install-extension.html\n");
}
if(!extension_loaded('posix'))
{
exit("Please install posix extension.See http://doc3.workerman.net/appendices/install-extension.html\n");
}
// 標(biāo)記是全局啟動
define('GLOBAL_START', 1);
// 注意這里的路徑
require_once '../vendor/autoload.php';
// 加載所有Applications/*/start.php,以便啟動所有服務(wù)
foreach(glob(__DIR__.'/Applications/*/start*.php') as $start_file)
{
require_once $start_file;
}
// 運行所有服務(wù)
Worker::runAll();
3. start_gateway.php
·
Kann in ApplicationsYourAppstart_gateway.php bearbeitet werden // 部分文件內(nèi)容
//將$gateway改成websocket協(xié)議,demo中是text協(xié)議
$gateway = new Gateway("websocket://0.0.0.0:8282");
4.start_register.php
·
Es ist zu beachten, dass $register in start_register.php ein Textprotokoll sein muss und der Port notiert werden sollte // register 服務(wù)必須是text協(xié)議
$register = new Register('text://192.168.124.125:1238');
5. ?ffnen Sie nach der Konfiguration start.php
$ php start.php start
4. Implementierung – Serverentwicklung
Wie oben erw?hnt, geht der Benutzer nur dann über den onConnect($client_id) des Gateways, wenn der Die Verbindung wird ausgel?st und alle Gesch?ftsvorg?nge sollten im Websystem implementiert werden. Also habe ich einen Controller von GatewayServer.php erstellt, um diese Dienste zu verwalten
<?php /** * Author: root * Date : 17-3-27 * time : 上午12:32 */ namespace app\index\controller; use GatewayClient\Gateway; use think\Cache; use think\Controller; use think\Request; use think\Session; class GatewayServer extends Controller { public function _initialize(){ } public function bind(Request $request) { // 用戶連接websocket之后,綁定uid和clientid,同時進(jìn)行分組,根據(jù)接收到的roomid進(jìn)行分組操作 $userGuid=Session::get('loginuser'); $roomId=intval(trimAll($request->post('room'))); $clientId=trimAll($request->post('client_id')); // 接受到上面的三個參數(shù),進(jìn)行分組操作 Gateway::$registerAddress = '192.168.124.125:1238'; // client_id與uid綁定 // Gateway::bindUid($clientId, $userGuid); // 加入某個群組(可調(diào)用多次加入多個群組) 將clientid加入roomid分組中 Gateway::joinGroup($clientId, $roomId); // 返回ajax json信息 $dataArr=[ 'code'=>$userGuid, 'status'=>true, 'message'=>'Group Success' ]; return json()->data($dataArr); } // 接受用戶的信息 并且發(fā)送 public function send(Request $request){ Gateway::$registerAddress = '192.168.124.125:1238'; // 獲得數(shù)據(jù) $userGuid=Session::get('loginuser'); $roomId=intval(trimAll($request->post('room'))); $message=trim($request->post('message')); // 獲得用戶的稱呼 $userInfo=Cache::get($userGuid); // 將用戶的昵稱以及用戶的message進(jìn)行拼接 $nickname=$userInfo['nickname']; $message=$nickname." : ".$message; // 發(fā)送信息應(yīng)當(dāng)發(fā)送json數(shù)據(jù),同時應(yīng)該返回發(fā)送的用戶的guid,用于客戶端進(jìn)行判斷使用 $dataArr=json_encode(array( 'message' => $message, 'user'=>$userGuid )); // 向roomId的分組發(fā)送數(shù)據(jù) Gateway::sendToGroup($roomId,$dataArr); } }
5. Implementierung – Client-Verbindung und Senden/Empfangen:
Nach dem ?ffnen des Gateways k?nnen Sie überwachen und warten, bis der Browser zugreift. Der Client verwendet js, um den Websocket hier zu überwachen:
1. Wird verwendet, um die Client-Verbindung zum Websocket zu verwalten und Nachrichten zu empfangen// 這個示例和gateway官網(wǎng)的示例是一樣的 // 監(jiān)聽端口 ws = new WebSocket("ws://192.168.124.125:8282"); // 綁定分組的ajaxURL var ajaxUrl="{:url('/gateway/bind')}"; // 發(fā)送消息的ajaxURL var ajaxMsgUrl="{:url('/gateway/send')}"; // 通過房間號進(jìn)行分組 var roomId="{$roomInfo.guid}"; // 獲取當(dāng)前登錄用戶的guid,用于標(biāo)識是自己發(fā)送的信息 var loginUser="{$userLoginInfo.guid}"; // 獲取當(dāng)前房間號的主播的uid,用于標(biāo)識是主播發(fā)送的信息 var roomUser="{$roomInfo.uid}"; // 服務(wù)端主動推送消息時會觸發(fā)這里的onmessage ws.onmessage = function(e){ // console.log(e.data); // json數(shù)據(jù)轉(zhuǎn)換成js對象 var data = eval("("+e.data+")"); var type = data.type || ''; switch(type){ // Events.php中返回的init類型的消息,將client_id發(fā)給后臺進(jìn)行uid綁定 case 'init': // 利用jquery發(fā)起ajax請求,將client_id發(fā)給后端進(jìn)行uid綁定 $.post(ajaxUrl, {client_id: data.client_id,room:roomId}, function(data){ // console.log(data); }, 'json'); break; // 當(dāng)mvc框架調(diào)用GatewayClient發(fā)消息時直接alert出來 default : // 如果登陸用戶的guid和數(shù)據(jù)發(fā)送者的guid一樣,則使用不同的顏色(只能自己看到) if(loginUser == data.user){ addMsgToHtml(data.message,'#F37B1D'); break; // 如果發(fā)送者的guid和主播uid一樣,則對所有的顯示都增加一個[主播標(biāo)識] }else if(data.user==roomUser){ addMsgToHtml("[主播] "+data.message,'#0e90d2'); break; }else{ // 其他的就正常發(fā)送消息 addMsgToHtml(data.message,'#333'); } break; } };
2 . Wird verwendet, um empfangene Nachrichten zur Anzeige hinzuzufügen
// 向面板中增加新接收到的消息 // 其中message是消息,color是顯示的顏色,主要為了區(qū)分主播以及自己發(fā)送的消息和系統(tǒng)提示 function addMsgToHtml(message,color) { if(message.length==0){ return false; } // 獲取html,并且增加html var obj=$("#room-viedo-chat"); var html=obj.html(); // html+='<p><font color="'+color+'">'+message+'</p>'; obj.html(html); // 將滾動條滾動到底部 obj.scrollTop(obj[0].scrollHeight); }
3. Wird verwendet, um Nachrichten zu senden
// 發(fā)送聊天消息 function sendMsg(){ // 去掉onclick屬性,使得3秒之內(nèi)無法發(fā)送信息 $("#sendMsgBox").attr('onclick',''); var btnObj=$("#sendMsgBtn"); var tmpNum=3; var tmpMsg=tmpNum+' S'; btnObj.text(tmpMsg); var int =setInterval(function () { // 3秒之內(nèi)不能發(fā)送信息,3秒之后,回復(fù)onclick屬性以及文字 if(tmpNum==0){ tmpMsg="發(fā)送"; clearInterval(int); btnObj.text("發(fā)送"); $("#sendMsgBox").attr('onclick','sendMsg()'); } btnObj.text(tmpMsg); tmpNum-=1; tmpMsg=tmpNum+' S'; },1000); var message=$("#chattext").val().trim(); var obj=$("#room-viedo-chat"); var html=obj.html(); if(message.length>=140){ // 獲取html,并且增加html addMsgToHtml("系統(tǒng)提示: 不能超過140個字符","#8b0000"); return false; } if(message.length==0){ // 獲取html,并且增加html addMsgToHtml("系統(tǒng)提示: 不能發(fā)送空消息","#8b0000"); return false; } // 向server端發(fā)送ajax請求 $.post(ajaxMsgUrl,{room:roomId,message:message},function (data) { },'json'); return false; }
Ein kleiner HTML-Code
<!--chat box start --> <div class=" am-u-md-12 am-u-lg-12 room-viedo-chat" id="room-viedo-chat" style="font-size:14px;"> </div> <div class="am-u-md-12 am-u-lg-12 room-viedo-chat-button-box"> <div class="left-div"> <textarea name="chattext" id="chattext" placeholder="輸入聊天內(nèi)容..."></textarea> </div> <div class="am-btn am-btn-default right-div am-text-center"onclick="sendMsg();"id="sendMsgBox"> <span class="" id="sendMsgBtn"> 發(fā)送 </span> </div> </div> <!--chat box end -->
六、效果:
效果很明顯:
·系統(tǒng)提示是單獨的顏色
·本人發(fā)布的,是自己能夠分辨的橙色
·主播發(fā)布的是藍(lán)色,同時前面有[主播]標(biāo)識
·看其他人發(fā)布的就是普通的顏色
PHP中文網(wǎng),有大量免費的workerman入門教程,歡迎大家學(xué)習(xí)!
Das obige ist der detaillierte Inhalt vonWie implementiert Workerman den Gruppenchat?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Hei?e KI -Werkzeuge

Undress AI Tool
Ausziehbilder kostenlos

Undresser.AI Undress
KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover
Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Clothoff.io
KI-Kleiderentferner

Video Face Swap
Tauschen Sie Gesichter in jedem Video mühelos mit unserem v?llig kostenlosen KI-Gesichtstausch-Tool aus!

Hei?er Artikel

Hei?e Werkzeuge

Notepad++7.3.1
Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version
Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1
Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6
Visuelle Webentwicklungstools

SublimeText3 Mac-Version
Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

1. Suchen und ?ffnen Sie die WeChat-Software auf Ihrem Telefon. 2. Klicken Sie auf den Gruppenchat, in dem die Person aus der Gruppe entfernt werden muss, um die Chat-Seite aufzurufen. 3. Klicken Sie oben rechts auf der Chat-Seite auf [...]. 4. Wischen Sie nach unten, um das [-] hinter den Gruppenmitgliedern zu finden und darauf zu klicken.

Um das Hochladen und Herunterladen von Dateien in Workerman-Dokumenten zu implementieren, sind spezifische Codebeispiele erforderlich. Einführung: Workerman ist ein leistungsstarkes PHP-Framework für die asynchrone Netzwerkkommunikation, das einfach, effizient und benutzerfreundlich ist. In der tats?chlichen Entwicklung sind das Hochladen und Herunterladen von Dateien h?ufige Funktionsanforderungen. In diesem Artikel wird erl?utert, wie das Workerman-Framework zum Implementieren des Hochladens und Herunterladens von Dateien verwendet wird, und es werden spezifische Codebeispiele aufgeführt. 1. Datei-Upload: Unter Datei-Upload versteht man die übertragung von Dateien vom lokalen Computer auf den Server. Folgendes wird verwendet

Swoole und Workerman sind beide leistungsstarke PHP-Server-Frameworks. Swoole ist für seine asynchrone Verarbeitung, hervorragende Leistung und Skalierbarkeit bekannt und eignet sich für Projekte, die eine gro?e Anzahl gleichzeitiger Anfragen und einen hohen Durchsatz verarbeiten müssen. Workerman bietet die Flexibilit?t sowohl des asynchronen als auch des synchronen Modus mit einer intuitiven API, die sich besser für Benutzerfreundlichkeit und Projekte eignet, die ein geringeres Parallelit?tsvolumen bew?ltigen.

Einführung in die Implementierung der grundlegenden Verwendung von Workerman-Dokumenten: Workerman ist ein leistungsstarkes PHP-Entwicklungsframework, mit dem Entwickler problemlos Netzwerkanwendungen mit hoher Parallelit?t erstellen k?nnen. In diesem Artikel wird die grundlegende Verwendung von Workerman vorgestellt, einschlie?lich Installation und Konfiguration, Erstellung von Diensten und überwachungsports, Bearbeitung von Clientanfragen usw. Und geben Sie entsprechende Codebeispiele an. 1. Installieren und konfigurieren Sie Workerman. Geben Sie in der Befehlszeile den folgenden Befehl ein, um Workerman zu installieren: c

Bei der Nutzung von QQ, einer sozialen Software, k?nnen sich andere Benutzer über Gruppenchats als Freunde hinzufügen. Lassen Sie mich Ihnen vorstellen, wie Sie das Hinzufügen von mir als Freund über den Gruppenchat einrichten und aktivieren. Klicken Sie nach dem Aufrufen der mobilen QQ-Oberfl?che auf den pers?nlichen Avatar in der oberen linken Ecke, um die Menüseite zu ?ffnen, und klicken Sie dann auf die Funktion ?Einstellungen“ in der unteren linken Ecke der Seite, um die Einstellungsoberfl?che aufzurufen. 2. Nachdem Sie zur Einstellungsseite gelangt sind, klicken Sie zur Auswahl auf den Punkt ?Datenschutz“. 3. Als n?chstes gibt es auf der Datenschutzseite die Option ?So füge ich mich als Freund hinzu“. Klicken Sie darauf, um einzutreten. 4. Auf der neuen Seite sehen Sie unter ?Sie k?nnen mich auf folgende Weise als Freund hinzufügen“ eine Liste mit Optionen. Klicken Sie auf die entsprechende Schaltfl?che hinter ?Gruppenchat“. Wenn die Schaltfl?che auf Blau eingestellt ist, bedeutet dies, dass sie aktiviert ist und andere Benutzer sich im Gruppenchat wiederfinden k?nnen.

So implementieren Sie die Timer-Funktion im Workerman-Dokument Workerman ist ein leistungsstarkes PHP-Framework für die asynchrone Netzwerkkommunikation, das eine Fülle von Funktionen bereitstellt, einschlie?lich der Timer-Funktion. Verwenden Sie Timer, um Code innerhalb bestimmter Zeitintervalle auszuführen. Dies eignet sich sehr gut für Anwendungsszenarien wie geplante Aufgaben und Abfragen. Als n?chstes werde ich detailliert vorstellen, wie die Timer-Funktion in Workerman implementiert wird, und spezifische Codebeispiele bereitstellen. Schritt 1: Workerman installieren Zuerst müssen wir Worker installieren

Workerman-Entwicklung: Echtzeit-Videoanrufe basierend auf dem UDP-Protokoll Zusammenfassung: In diesem Artikel wird erl?utert, wie Sie mit dem Workerman-Framework eine Echtzeit-Videoanruffunktion basierend auf dem UDP-Protokoll implementieren. Wir werden ein tiefgreifendes Verst?ndnis der Eigenschaften des UDP-Protokolls erlangen und anhand von Codebeispielen zeigen, wie man eine einfache, aber vollst?ndige Echtzeit-Videoanrufanwendung erstellt. Einführung: In der Netzwerkkommunikation sind Echtzeit-Videoanrufe eine sehr wichtige Funktion. Beim herk?mmlichen TCP-Protokoll kann es bei der Implementierung von Videoanrufen mit hoher Echtzeitgeschwindigkeit zu Problemen wie übertragungsverz?gerungen kommen. Und UDP

Für die Implementierung der Reverse-Proxy-Funktion im Workerman-Dokument sind spezifische Codebeispiele erforderlich. Einführung: Workerman ist ein leistungsstarkes PHP-Framework für die Netzwerkkommunikation mit mehreren Prozessen, das umfangreiche Funktionen und leistungsstarke Leistung bietet und in der Web-Echtzeitkommunikation weit verbreitet ist Service-Szenarien. Unter anderem unterstützt Workerman auch die Reverse-Proxy-Funktion, mit der Lastausgleich und statisches Ressourcen-Caching realisiert werden k?nnen, wenn der Server externe Dienste bereitstellt. In diesem Artikel wird erl?utert, wie Sie Workerman zum Implementieren der Reverse-Proxy-Funktion verwenden.
