Heim PHP-Framework Workerman Wie implementiert Workerman den Gruppenchat?

Wie implementiert Workerman den Gruppenchat?

Dec 12, 2019 am 09:31 AM
workerman 分组 Gruppenchat

Wie implementiert Workerman den Gruppenchat?

1. 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_once

ini_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");
}
// 检查扩展
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");
}
// 标记是全局启动
define('GLOBAL_START', 1);
// 注意这里的路径
require_once '../vendor/autoload.php';
// 加载所有Applications/*/start.php,以便启动所有服务
foreach(glob(__DIR__.'/Applications/*/start*.php') as $start_file)
{
    require_once $start_file;
}
// 运行所有服务
Worker::runAll();
Nach dem Login kopieren
3. start_gateway.php

·

Kann in ApplicationsYourAppstart_gateway.php bearbeitet werden

// 部分文件内容
//将$gateway改成websocket协议,demo中是text协议
$gateway = new Gateway("websocket://0.0.0.0:8282");
Nach dem Login kopieren
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 服务必须是text协议
$register = new Register('text://192.168.124.125:1238');
Nach dem Login kopieren
5. Öffnen Sie nach der Konfiguration start.php

$ php start.php start
Nach dem Login kopieren

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,同时进行分组,根据接收到的roomid进行分组操作
        $userGuid=Session::get(&#39;loginuser&#39;);
        $roomId=intval(trimAll($request->post(&#39;room&#39;)));
        $clientId=trimAll($request->post(&#39;client_id&#39;));
        // 接受到上面的三个参数,进行分组操作
        Gateway::$registerAddress = &#39;192.168.124.125:1238&#39;;
        // client_id与uid绑定
        // Gateway::bindUid($clientId, $userGuid);
        // 加入某个群组(可调用多次加入多个群组) 将clientid加入roomid分组中
        Gateway::joinGroup($clientId, $roomId);
        // 返回ajax json信息
        $dataArr=[
            &#39;code&#39;=>$userGuid,
            &#39;status&#39;=>true,
            &#39;message&#39;=>&#39;Group Success&#39;
        ];
        return json()->data($dataArr);
    }
    // 接受用户的信息 并且发送
    public function send(Request $request){
        Gateway::$registerAddress = &#39;192.168.124.125:1238&#39;;
        // 获得数据
        $userGuid=Session::get(&#39;loginuser&#39;);
        $roomId=intval(trimAll($request->post(&#39;room&#39;)));
        $message=trim($request->post(&#39;message&#39;));
        // 获得用户的称呼
        $userInfo=Cache::get($userGuid);
        // 将用户的昵称以及用户的message进行拼接
        $nickname=$userInfo[&#39;nickname&#39;];
        $message=$nickname." : ".$message;
        // 发送信息应当发送json数据,同时应该返回发送的用户的guid,用于客户端进行判断使用
        $dataArr=json_encode(array(
            &#39;message&#39; => $message,
            &#39;user&#39;=>$userGuid
        ));
        // 向roomId的分组发送数据
        Gateway::sendToGroup($roomId,$dataArr);
    }
}
Nach dem Login kopieren

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官网的示例是一样的
    // 监听端口
    ws = new WebSocket("ws://192.168.124.125:8282");
    // 绑定分组的ajaxURL
    var ajaxUrl="{:url(&#39;/gateway/bind&#39;)}";
    // 发送消息的ajaxURL
    var ajaxMsgUrl="{:url(&#39;/gateway/send&#39;)}";
    // 通过房间号进行分组
    var roomId="{$roomInfo.guid}";
    // 获取当前登录用户的guid,用于标识是自己发送的信息
    var loginUser="{$userLoginInfo.guid}";
    // 获取当前房间号的主播的uid,用于标识是主播发送的信息
    var roomUser="{$roomInfo.uid}";
    // 服务端主动推送消息时会触发这里的onmessage
    ws.onmessage = function(e){
        // console.log(e.data);
        // json数据转换成js对象
        var data = eval("("+e.data+")");
        var type = data.type || &#39;&#39;;
        switch(type){
            // Events.php中返回的init类型的消息,将client_id发给后台进行uid绑定
            case &#39;init&#39;:
                // 利用jquery发起ajax请求,将client_id发给后端进行uid绑定
                $.post(ajaxUrl, {client_id: data.client_id,room:roomId}, function(data){
                    // console.log(data);
                }, &#39;json&#39;);
                break;
            // 当mvc框架调用GatewayClient发消息时直接alert出来
            default :
                // 如果登陆用户的guid和数据发送者的guid一样,则使用不同的颜色(只能自己看到)
                if(loginUser == data.user){
                    addMsgToHtml(data.message,&#39;#F37B1D&#39;);
                    break;
                // 如果发送者的guid和主播uid一样,则对所有的显示都增加一个[主播标识]
                }else if(data.user==roomUser){
                    addMsgToHtml("[主播] "+data.message,&#39;#0e90d2&#39;);
                    break;
                }else{
                // 其他的就正常发送消息
                    addMsgToHtml(data.message,&#39;#333&#39;);
                }
                break;
        }
    };
Nach dem Login kopieren

2 . Wird verwendet, um empfangene Nachrichten zur Anzeige hinzuzufügen

// 向面板中增加新接收到的消息
    // 其中message是消息,color是显示的颜色,主要为了区分主播以及自己发送的消息和系统提示
    function addMsgToHtml(message,color) {
        if(message.length==0){
            return false;
        }
        // 获取html,并且增加html
        var obj=$("#room-viedo-chat");
        var html=obj.html();
        // 
        html+=&#39;<p><font color="&#39;+color+&#39;">&#39;+message+&#39;</p>&#39;;
        obj.html(html);
        // 将滚动条滚动到底部
        obj.scrollTop(obj[0].scrollHeight);
    }
Nach dem Login kopieren

3. Wird verwendet, um Nachrichten zu senden

// 发送聊天消息
    function sendMsg(){
        // 去掉onclick属性,使得3秒之内无法发送信息
        $("#sendMsgBox").attr(&#39;onclick&#39;,&#39;&#39;);
        var btnObj=$("#sendMsgBtn");
        var tmpNum=3;
        var tmpMsg=tmpNum+&#39; S&#39;;
        btnObj.text(tmpMsg);
        var int =setInterval(function () {
            // 3秒之内不能发送信息,3秒之后,回复onclick属性以及文字
            if(tmpNum==0){
                tmpMsg="发送";
                clearInterval(int);
                btnObj.text("发送");
                $("#sendMsgBox").attr(&#39;onclick&#39;,&#39;sendMsg()&#39;);
            }
            btnObj.text(tmpMsg);
            tmpNum-=1;
            tmpMsg=tmpNum+&#39; S&#39;;
        },1000);
        var message=$("#chattext").val().trim();
        var obj=$("#room-viedo-chat");
        var html=obj.html();
        if(message.length>=140){
            // 获取html,并且增加html
            addMsgToHtml("系统提示: 不能超过140个字符","#8b0000");
            return false;
        }
        if(message.length==0){
            // 获取html,并且增加html
            addMsgToHtml("系统提示: 不能发送空消息","#8b0000");
            return false;
        }
        // 向server端发送ajax请求
        $.post(ajaxMsgUrl,{room:roomId,message:message},function (data) {
        },&#39;json&#39;);
        return false;
    }
Nach dem Login kopieren

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="输入聊天内容..."></textarea>
        </div>
        <div class="am-btn am-btn-default right-div am-text-center"onclick="sendMsg();"id="sendMsgBox">
            <span class="" id="sendMsgBtn">
                发送
            </span>
        </div>
    </div>
    <!--chat box end -->
Nach dem Login kopieren

六、效果:

效果很明显:

·系统提示是单独的颜色

·本人发布的,是自己能够分辨的橙色

·主播发布的是蓝色,同时前面有[主播]标识

·看其他人发布的就是普通的颜色

Wie implementiert Workerman den Gruppenchat?

PHP中文网,有大量免费的workerman入门教程,欢迎大家学习!

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!

Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn

Heiße KI -Werkzeuge

Undresser.AI Undress

Undresser.AI Undress

KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover

AI Clothes Remover

Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool

Undress AI Tool

Ausziehbilder kostenlos

Clothoff.io

Clothoff.io

KI-Kleiderentferner

AI Hentai Generator

AI Hentai Generator

Erstellen Sie kostenlos Ai Hentai.

Heißer Artikel

R.E.P.O. Energiekristalle erklärten und was sie tun (gelber Kristall)
4 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Beste grafische Einstellungen
4 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. So reparieren Sie Audio, wenn Sie niemanden hören können
4 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Chat -Befehle und wie man sie benutzt
4 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌

Heiße Werkzeuge

Notepad++7.3.1

Notepad++7.3.1

Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version

SublimeText3 chinesische Version

Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1

Senden Sie Studio 13.0.1

Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6

Dreamweaver CS6

Visuelle Webentwicklungstools

SublimeText3 Mac-Version

SublimeText3 Mac-Version

Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Detaillierte Methode zum Entfernen von Personen aus dem WeChat-Gruppenchat Detaillierte Methode zum Entfernen von Personen aus dem WeChat-Gruppenchat Mar 25, 2024 pm 05:00 PM

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.

Implementieren Sie das Hoch- und Herunterladen von Dateien in Workerman-Dokumenten Implementieren Sie das Hoch- und Herunterladen von Dateien in Workerman-Dokumenten Nov 08, 2023 pm 06:02 PM

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

Was ist besser, Swoole oder Workerman? Was ist besser, Swoole oder Workerman? Apr 09, 2024 pm 07:00 PM

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.

So erlaube ich QQ, mich als Freund im Gruppenchat hinzuzufügen So erlaube ich QQ, mich als Freund im Gruppenchat hinzuzufügen Mar 01, 2024 am 11:31 AM

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 grundlegende Verwendung von Workerman-Dokumenten So implementieren Sie die grundlegende Verwendung von Workerman-Dokumenten Nov 08, 2023 am 11:46 AM

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

Workerman-Entwicklung: So implementieren Sie Echtzeit-Videoanrufe basierend auf dem UDP-Protokoll Workerman-Entwicklung: So implementieren Sie Echtzeit-Videoanrufe basierend auf dem UDP-Protokoll Nov 08, 2023 am 08:03 AM

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

So erstellen Sie mit Workerman ein hochverfügbares Lastausgleichssystem So erstellen Sie mit Workerman ein hochverfügbares Lastausgleichssystem Nov 07, 2023 pm 01:16 PM

Für die Verwendung von Workerman zum Aufbau eines hochverfügbaren Lastausgleichssystems sind spezifische Codebeispiele erforderlich. Im Bereich der modernen Technologie müssen mit der rasanten Entwicklung des Internets immer mehr Websites und Anwendungen eine große Anzahl gleichzeitiger Anforderungen verarbeiten. Um eine hohe Verfügbarkeit und Leistung zu erreichen, ist das Lastausgleichssystem zu einer der wesentlichen Komponenten geworden. In diesem Artikel wird erläutert, wie Sie mit dem PHP-Open-Source-Framework Workerman ein Hochverfügbarkeits-Lastausgleichssystem erstellen und spezifische Codebeispiele bereitstellen. 1. Einführung in WorkermanWorke

So implementieren Sie die Reverse-Proxy-Funktion im Workerman-Dokument So implementieren Sie die Reverse-Proxy-Funktion im Workerman-Dokument Nov 08, 2023 pm 03:46 PM

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.

See all articles