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

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

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

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

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

#一、基礎(chǔ)

##1. workerman

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

可以單獨(dú)部署,也可以整合進(jìn)MVC的框架(TP,laravel等),可以說非常實(shí)用,並發(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長(zhǎng)連結(jié)框架,用於快速開發(fā)TCP長(zhǎng)連接應(yīng)用。

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

gayhub位址:

https://github.com/walkor/GatewayWorker

3. gatewayClient

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

https://github.com/walkor/GatewayClient

二、理論:

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

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

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

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

·

只有當(dāng)mvc框架需要主動(dòng)向?yàn)g覽器推送資料時(shí)才在mvc框架中呼叫Gateway的API(GatewayClient)完成推送。

2. 實(shí)作步驟:

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

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

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

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

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

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

#1.下載並使用gateway

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

·

start.php是需要使用php命令列運(yùn)行的。

·

注意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");
}
// 檢查擴(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)記是全局啟動(dòng)
define('GLOBAL_START', 1);
// 注意這里的路徑
require_once '../vendor/autoload.php';
// 加載所有Applications/*/start.php,以便啟動(dòng)所有服務(wù)
foreach(glob(__DIR__.'/Applications/*/start*.php') as $start_file)
{
    require_once $start_file;
}
// 運(yùn)行所有服務(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é)定,同時(shí)需要注意連接埠

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

##
$ php start.php start

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

上面提到了,使用者只有在觸發(fā)連線的時(shí)候才經(jīng)過gateway的onConnect($client_id),而所有的業(yè)務(wù)操作都應(yīng)該在web系統(tǒng)中實(shí)作。 因此我創(chuàng)建了一個(gè)GatewatServer.php的controller,負(fù)責(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,同時(shí)進(jìn)行分組,根據(jù)接收到的roomid進(jìn)行分組操作
        $userGuid=Session::get(&#39;loginuser&#39;);
        $roomId=intval(trimAll($request->post(&#39;room&#39;)));
        $clientId=trimAll($request->post(&#39;client_id&#39;));
        // 接受到上面的三個(gè)參數(shù),進(jìn)行分組操作
        Gateway::$registerAddress = &#39;192.168.124.125:1238&#39;;
        // client_id與uid綁定
        // Gateway::bindUid($clientId, $userGuid);
        // 加入某個(gè)群組(可調(diào)用多次加入多個(gè)群組) 將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進(jìn)行拼接
        $nickname=$userInfo[&#39;nickname&#39;];
        $message=$nickname." : ".$message;
        // 發(fā)送信息應(yīng)當(dāng)發(fā)送json數(shù)據(jù),同時(shí)應(yīng)該返回發(fā)送的用戶的guid,用于客戶端進(jìn)行判斷使用
        $dataArr=json_encode(array(
            &#39;message&#39; => $message,
            &#39;user&#39;=>$userGuid
        ));
        // 向roomId的分組發(fā)送數(shù)據(jù)
        Gateway::sendToGroup($roomId,$dataArr);
    }
}

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

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

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

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

// 這個(gè)示例和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;)}";
    // 通過房間號(hào)進(jìn)行分組
    var roomId="{$roomInfo.guid}";
    // 獲取當(dāng)前登錄用戶的guid,用于標(biāo)識(shí)是自己發(fā)送的信息
    var loginUser="{$userLoginInfo.guid}";
    // 獲取當(dāng)前房間號(hào)的主播的uid,用于標(biāo)識(shí)是主播發(fā)送的信息
    var roomUser="{$roomInfo.uid}";
    // 服務(wù)端主動(dòng)推送消息時(shí)會(huì)觸發(fā)這里的onmessage
    ws.onmessage = function(e){
        // console.log(e.data);
        // json數(shù)據(jù)轉(zhuǎn)換成js對(duì)象
        var data = eval("("+e.data+")");
        var type = data.type || &#39;&#39;;
        switch(type){
            // Events.php中返回的init類型的消息,將client_id發(fā)給后臺(tái)進(jìn)行uid綁定
            case &#39;init&#39;:
                // 利用jquery發(fā)起ajax請(qǐng)求,將client_id發(fā)給后端進(jìn)行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ā)消息時(shí)直接alert出來
            default :
                // 如果登陸用戶的guid和數(shù)據(jù)發(fā)送者的guid一樣,則使用不同的顏色(只能自己看到)
                if(loginUser == data.user){
                    addMsgToHtml(data.message,&#39;#F37B1D&#39;);
                    break;
                // 如果發(fā)送者的guid和主播uid一樣,則對(duì)所有的顯示都增加一個(gè)[主播標(biāo)識(shí)]
                }else if(data.user==roomUser){
                    addMsgToHtml("[主播] "+data.message,&#39;#0e90d2&#39;);
                    break;
                }else{
                // 其他的就正常發(fā)送消息
                    addMsgToHtml(data.message,&#39;#333&#39;);
                }
                break;
        }
    };

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

// 向面板中增加新接收到的消息
    // 其中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);
        // 將滾動(dòng)條滾動(dòng)到底部
        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個(gè)字符","#8b0000");
            return false;
        }
        if(message.length==0){
            // 獲取html,并且增加html
            addMsgToHtml("系統(tǒng)提示: 不能發(fā)送空消息","#8b0000");
            return false;
        }
        // 向server端發(fā)送ajax請(qǐng)求
        $.post(ajaxMsgUrl,{room:roomId,message:message},function (data) {
        },&#39;json&#39;);
        return false;
    }
######4.一點(diǎn)兒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)提示是單獨(dú)的顏色

·本人發(fā)布的,是自己能夠分辨的橙色

·主播發(fā)布的是藍(lán)色,同時(shí)前面有[主播]標(biāo)識(shí)

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

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

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

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

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

熱AI工具

Undress AI Tool

Undress AI Tool

免費(fèi)脫衣圖片

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

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

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費(fèi)的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

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

Dreamweaver CS6

Dreamweaver CS6

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

SublimeText3 Mac版

SublimeText3 Mac版

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

熱門話題

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

1.找到並打開手機(jī)裡的微信軟體。 2.點(diǎn)選需要移出群組人員的群組聊,進(jìn)入聊天頁(yè)面。 3.聊天頁(yè)面右上角點(diǎn)選【...】。 4.往下滑動(dòng)找到並點(diǎn)選群組人員後方的【-】處。

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

實(shí)現(xiàn)Workerman文件中的文件上傳與下載,需要具體程式碼範(fàn)例引言:Workerman是一款高效能的PHP非同步網(wǎng)路通訊框架,具備簡(jiǎn)潔、高效、易用等特點(diǎn)。在實(shí)際開發(fā)中,文件上傳和下載是常見的功能需求,本文將介紹如何使用Workerman框架實(shí)現(xiàn)文件的上傳和下載,並給出具體的程式碼範(fàn)例。一、檔案上傳:檔案上傳是指將本機(jī)上的檔案?jìng)鬏斨了欧鞫说牟僮?。下面是使?/p>

swoole和workerman哪個(gè)好 swoole和workerman哪個(gè)好 Apr 09, 2024 pm 07:00 PM

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

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

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

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

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

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

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

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

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

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

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

See all articles