国产av日韩一区二区三区精品,成人性爱视频在线观看,国产,欧美,日韩,一区,www.成色av久久成人,2222eeee成人天堂

首頁 php框架 Workerman workerman怎麼實現(xiàn)分組群聊

workerman怎麼實現(xiàn)分組群聊

Dec 12, 2019 am 09:31 AM
workerman 分組 群聊

workerman怎麼實現(xiàn)分組群聊

#一、基礎(chǔ)

##1. workerman

workerman是國人開發(fā)的良心高效能的PHP socket 伺服器框架,在全球最大同性交友平臺gayHub的star都4K多,可以想像是多麼的牛X。

可以單獨部署,也可以整合進MVC的框架(TP,laravel等),可以說非常實用,並發(fā)效果也好。

官網(wǎng)網(wǎng)址:http://www.workerman.net/workerman

#gayhub網(wǎng)址:

https://github.com/walkor /workerman/

2. gateway-worker

#gateway-worker(後面直接稱為gateway)是基於workerman開發(fā)的TCP長連結(jié)框架,用於快速開發(fā)TCP長連接應(yīng)用。

線上聊天一般都是實用長連線保持通信,使用 workerman雖然能夠做到同樣的效果,但是gateway更加的方便快速。 (輪詢建置的聊天室已經(jīng)OUT了,實在是太...)

gayhub位址:

https://github.com/walkor/GatewayWorker

3. gatewayClient

gateClient是用來輔助workerman或是gateway進行使用者分組以及傳送訊息給使用者的元件,同時,能夠快速便捷的將原有系統(tǒng)的uid和clientid綁定。 gayhub位址:

https://github.com/walkor/GatewayClient

二、理論:

1. 與MVC系統(tǒng)整合的原則:

現(xiàn)有mvc框架專案與GatewayWorker獨立部署互不干擾;·

所有的業(yè)務(wù)邏輯都由網(wǎng)站頁面post/get到mvc框架完成;##·

GatewayWorker不接受客戶端發(fā)送的數(shù)據(jù),即GatewayWorker不處理任何業(yè)務(wù)邏輯,GatewayWorker僅僅當(dāng)做一個單向的推送通道;

·

只有當(dāng)mvc框架需要主動向瀏覽器推送資料時才在mvc框架中呼叫Gateway的API(GatewayClient)完成推送。

2. 實作步驟:

(1)網(wǎng)站頁面建立與GatewayWorker的websocket連接;

(2)GatewayWorker發(fā)現(xiàn)有頁面發(fā)起連接時,將對應(yīng)連接的client_id發(fā)給網(wǎng)站頁面;

(3)網(wǎng)站頁面收到client_id後觸發(fā)一個ajax請求(假設(shè)是bind.php)將client_id發(fā)到mvc後端;

(4)mvc後端bind.php收到client_id後利用GatewayClient呼叫Gateway::bindUid($client_id, $uid)將client_id與目前uid(使用者id或客戶端唯一識別)綁定。如果有群組、群發(fā)功能,也可以利用Gateway::joinGroup($client_id, $group_id)將client_id加入對應(yīng)分組;(5)頁面發(fā)起的所有請求都直接post/get到mvc框架統(tǒng)一處理,包括發(fā)送訊息;

(6)mvc框架處理業(yè)務(wù)過程中需要向某個uid或某個群組發(fā)送資料時,直接呼叫GatewayClient的介面Gateway::sendToUid Gateway::sendToGroup等發(fā)送即可。

三、實作—設(shè)定與開啟Gateway:

#1.下載並使用gateway

可以單獨使用,也可以放在框架的public目錄下。 2.編輯start.php

·

start.php是需要使用php命令列運行的。

·

注意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");
}
// 標(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

·

在ApplicationsYourAppstart_gateway.php中可以編輯

// 部分文件內(nèi)容
//將$gateway改成websocket協(xié)議,demo中是text協(xié)議
$gateway = new Gateway("websocket://0.0.0.0:8282");
4.start_register.php

##要注意start_register.php 中$register必須是text協(xié)定,同時需要注意連接埠

// register 服務(wù)必須是text協(xié)議
$register = new Register('text://192.168.124.125:1238');
5. 設(shè)定好後,開啟start.php

##
$ php start.php start

四、實作-服務(wù)端開發(fā)

上面提到了,使用者只有在觸發(fā)連線的時候才經(jīng)過gateway的onConnect($client_id),而所有的業(yè)務(wù)操作都應(yīng)該在web系統(tǒng)中實作。 因此我創(chuàng)建了一個GatewatServer.php的controller,負責(zé)處理這些業(yè)務(wù)

<?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ù)接收到的roomid進行分組操作
        $userGuid=Session::get(&#39;loginuser&#39;);
        $roomId=intval(trimAll($request->post(&#39;room&#39;)));
        $clientId=trimAll($request->post(&#39;client_id&#39;));
        // 接受到上面的三個參數(shù),進行分組操作
        Gateway::$registerAddress = &#39;192.168.124.125:1238&#39;;
        // client_id與uid綁定
        // Gateway::bindUid($clientId, $userGuid);
        // 加入某個群組(可調(diào)用多次加入多個群組) 將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);
    }
    // 接受用戶的信息 并且發(fā)送
    public function send(Request $request){
        Gateway::$registerAddress = &#39;192.168.124.125:1238&#39;;
        // 獲得數(shù)據(jù)
        $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;
        // 發(fā)送信息應(yīng)當(dāng)發(fā)送json數(shù)據(jù),同時應(yīng)該返回發(fā)送的用戶的guid,用于客戶端進行判斷使用
        $dataArr=json_encode(array(
            &#39;message&#39; => $message,
            &#39;user&#39;=>$userGuid
        ));
        // 向roomId的分組發(fā)送數(shù)據(jù)
        Gateway::sendToGroup($roomId,$dataArr);
    }
}

五、實作-客戶端連線與發(fā)送/接收:

開啟了gateway之後,就可以監(jiān)聽並且等待瀏覽器存取了。

客戶端這裡使用js監(jiān)聽websocket:

1. 用來處理客戶端連線websocket以及接收訊息

// 這個示例和gateway官網(wǎng)的示例是一樣的
    // 監(jiān)聽端口
    ws = new WebSocket("ws://192.168.124.125:8282");
    // 綁定分組的ajaxURL
    var ajaxUrl="{:url(&#39;/gateway/bind&#39;)}";
    // 發(fā)送消息的ajaxURL
    var ajaxMsgUrl="{:url(&#39;/gateway/send&#39;)}";
    // 通過房間號進行分組
    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 || &#39;&#39;;
        switch(type){
            // Events.php中返回的init類型的消息,將client_id發(fā)給后臺進行uid綁定
            case &#39;init&#39;:
                // 利用jquery發(fā)起ajax請求,將client_id發(fā)給后端進行uid綁定
                $.post(ajaxUrl, {client_id: data.client_id,room:roomId}, function(data){
                    // console.log(data);
                }, &#39;json&#39;);
                break;
            // 當(dāng)mvc框架調(diào)用GatewayClient發(fā)消息時直接alert出來
            default :
                // 如果登陸用戶的guid和數(shù)據(jù)發(fā)送者的guid一樣,則使用不同的顏色(只能自己看到)
                if(loginUser == data.user){
                    addMsgToHtml(data.message,&#39;#F37B1D&#39;);
                    break;
                // 如果發(fā)送者的guid和主播uid一樣,則對所有的顯示都增加一個[主播標(biāo)識]
                }else if(data.user==roomUser){
                    addMsgToHtml("[主播] "+data.message,&#39;#0e90d2&#39;);
                    break;
                }else{
                // 其他的就正常發(fā)送消息
                    addMsgToHtml(data.message,&#39;#333&#39;);
                }
                break;
        }
    };

#2.用於將接收到的訊息新增至div中進行顯示

// 向面板中增加新接收到的消息
    // 其中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+=&#39;<p><font color="&#39;+color+&#39;">&#39;+message+&#39;</p>&#39;;
        obj.html(html);
        // 將滾動條滾動到底部
        obj.scrollTop(obj[0].scrollHeight);
    }

3.用於發(fā)送訊息######
// 發(fā)送聊天消息
    function sendMsg(){
        // 去掉onclick屬性,使得3秒之內(nèi)無法發(fā)送信息
        $("#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秒之內(nèi)不能發(fā)送信息,3秒之后,回復(fù)onclick屬性以及文字
            if(tmpNum==0){
                tmpMsg="發(fā)送";
                clearInterval(int);
                btnObj.text("發(fā)送");
                $("#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("系統(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) {
        },&#39;json&#39;);
        return false;
    }
######4.一點兒html程式碼######
<!--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ā)布的是藍色,同時前面有[主播]標(biāo)識

·看其他人發(fā)布的就是普通的顏色

workerman怎麼實現(xiàn)分組群聊

PHP中文網(wǎng),有大量免費的workerman入門教程,歡迎大家學(xué)習(xí)!

以上是workerman怎麼實現(xiàn)分組群聊的詳細內(nèi)容。更多資訊請關(guān)注PHP中文網(wǎng)其他相關(guān)文章!

本網(wǎng)站聲明
本文內(nèi)容由網(wǎng)友自願投稿,版權(quán)歸原作者所有。本站不承擔(dān)相應(yīng)的法律責(zé)任。如發(fā)現(xiàn)涉嫌抄襲或侵權(quán)的內(nèi)容,請聯(lián)絡(luò)admin@php.cn

熱AI工具

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅(qū)動的應(yīng)用程序,用於創(chuàng)建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發(fā)環(huán)境

Dreamweaver CS6

Dreamweaver CS6

視覺化網(wǎng)頁開發(fā)工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

熱門話題

Laravel 教程
1601
29
PHP教程
1502
276
微信群聊移出群人員的詳細方法 微信群聊移出群人員的詳細方法 Mar 25, 2024 pm 05:00 PM

1.找到並打開手機裡的微信軟體。 2.點選需要移出群組人員的群組聊,進入聊天頁面。 3.聊天頁面右上角點選【...】。 4.往下滑動找到並點選群組人員後方的【-】處。

實作Workerman文件中的文件上傳與下載 實作Workerman文件中的文件上傳與下載 Nov 08, 2023 pm 06:02 PM

實現(xiàn)Workerman文件中的文件上傳與下載,需要具體程式碼範(fàn)例引言:Workerman是一款高效能的PHP非同步網(wǎng)路通訊框架,具備簡潔、高效、易用等特點。在實際開發(fā)中,文件上傳和下載是常見的功能需求,本文將介紹如何使用Workerman框架實現(xiàn)文件的上傳和下載,並給出具體的程式碼範(fàn)例。一、檔案上傳:檔案上傳是指將本機上的檔案傳輸至伺服器端的操作。下面是使用

swoole和workerman哪個好 swoole和workerman哪個好 Apr 09, 2024 pm 07:00 PM

Swoole 和 Workerman 都是高效能 PHP 伺服器框架。 Swoole 以其非同步處理、出色的效能和可擴展性而聞名,適用於需要處理大量並發(fā)請求和高吞吐量的專案。 Workerman 提供了非同步和同步模式的靈活性,具有直覺的 API,更適合易用性和處理較低並發(fā)量的專案。

QQ如何允許群組聊天加我為好友 QQ如何允許群組聊天加我為好友 Mar 01, 2024 am 11:31 AM

使用QQ這款社群軟體時,其他用戶可以透過群組聊天來加入自己為好友。以下為大家介紹設(shè)定開啟透過群組聊天加我為好友的方法。進入手機QQ介面後,點選左上角的個人頭像,開啟選單頁面,然後在頁面的左下角點選「設(shè)定」功能,進入設(shè)定介面。 2.來到設(shè)定頁面後,在「隱私權(quán)」這項上點選選擇。 3.接下來,在隱私頁面裡有一個“加我為好友的方式”,在它的上面點擊進入。 4.在新的頁面裡「可透過以下方式加我為好友」下面會看到有選項列表,在「群組聊天」的後面點擊對應(yīng)的開關(guān)按鈕。當(dāng)按鈕設(shè)定為藍色時代表開啟,其他使用者就可以在群組聊天裡找到自

如何實作Workerman文件的基本使用方法 如何實作Workerman文件的基本使用方法 Nov 08, 2023 am 11:46 AM

如何實現(xiàn)Workerman文件的基本使用方法簡介:Workerman是一個高效能的PHP開發(fā)框架,它可以幫助開發(fā)者輕鬆建立高並發(fā)的網(wǎng)路應(yīng)用程式。本文將介紹Workerman的基本使用方法,包括安裝和設(shè)定、建立服務(wù)和監(jiān)聽連接埠、處理客戶端請求等。並給出相應(yīng)的程式碼範(fàn)例。一、安裝並設(shè)定Workerman在命令列中輸入以下命令來安裝Workerman:c

如何實作Workerman文件中的定時器功能 如何實作Workerman文件中的定時器功能 Nov 08, 2023 pm 05:06 PM

如何實現(xiàn)Workerman文件中的定時器功能Workerman是一款強大的PHP非同步網(wǎng)路通訊框架,它提供了豐富的功能,其中就包括定時器功能。使用定時器可以在指定的時間間隔內(nèi)執(zhí)行程式碼,非常適合定時任務(wù)、輪詢等應(yīng)用程式場景。接下來,我將詳細介紹如何在Workerman中實現(xiàn)定時器功能,並提供具體的程式碼範(fàn)例。第一步:安裝Workerman首先,我們需要安裝Worker

Workerman開發(fā):如何實現(xiàn)基於UDP協(xié)定的即時視訊通話 Workerman開發(fā):如何實現(xiàn)基於UDP協(xié)定的即時視訊通話 Nov 08, 2023 am 08:03 AM

Workerman開發(fā):基於UDP協(xié)議的即時視訊通話摘要:本文將介紹如何使用Workerman框架實現(xiàn)基於UDP協(xié)議的即時視訊通話功能。我們將深入了解UDP協(xié)議的特點,並透過程式碼範(fàn)例展示如何建立一個簡單但完整的即時視訊通話應(yīng)用程式。引言:在網(wǎng)路通訊中,即時視訊通話是一項非常重要的功能。傳統(tǒng)的TCP協(xié)定在實現(xiàn)即時性較高的視訊通話時,可能會有傳輸延遲等問題。而UDP

如何實現(xiàn)Workerman文件中的反向代理功能 如何實現(xiàn)Workerman文件中的反向代理功能 Nov 08, 2023 pm 03:46 PM

如何實現(xiàn)Workerman文件中的反向代理功能,需要具體程式碼範(fàn)例簡介:Workerman是一款高效能的PHP多進程網(wǎng)路通訊框架,提供了豐富的功能和強大的效能,廣泛應(yīng)用於Web即時通訊、長連接服務(wù)等場景。其中,Workerman也支援反向代理功能,可實現(xiàn)伺服器對外提供服務(wù)時的負載平衡和靜態(tài)資源快取等功能。本篇文章將介紹如何使用Workerman實現(xiàn)反向代理功

See all articles