1. 程式人生 > >使用Gateway-Worker實現多人分組實時聊天

使用Gateway-Worker實現多人分組實時聊天

一、基礎

1. workerman

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

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

官網地址:

gayhub地址:

2. gateway-worker

gateway-worker(後面直接稱gateway)是基於 workerman開發的TCP長連線框架,用於快速開發TCP長連線應用。

線上聊天一般都是實用長連線保持通訊,使用 workerman雖然能夠做到同樣的效果,但是gateway更加的方便快捷。

(輪詢構建的聊天室已經OUT了,實在是太...)

gayhub地址

3. gatewayClient

gateClient是用來輔助 workerman或者是gateway進行使用者分組以及向用戶傳送資訊的元件,同時,能夠快速便捷的將原有系統的uid和clientid繫結起來。

gayhub地址

二、理論:

1. 與MVC系統整合的原則:

  • 現有mvc框架專案與GatewayWorker獨立部署互不干擾
  • 所有的業務邏輯都由網站頁面post/get到mvc框架中完成
  • GatewayWorker不接受客戶端發來的資料,即GatewayWorker不處理任何業務邏輯,GatewayWorker僅僅當做一個單向的推送通道
  • 僅當mvc框架需要向瀏覽器主動推送資料時才在mvc框架中呼叫Gateway的API(GatewayClient)完成推送

2. 實現步驟:

  1. 網站頁面建立與GatewayWorker的websocket連線
  2. GatewayWorker發現有頁面發起連線時,將對應連線的client_id發給網站頁面
  3. 網站頁面收到client_id後觸發一個ajax請求(假設是bind.php)將client_id發到mvc後端
  4. mvc後端bind.php收到client_id後利用GatewayClient呼叫Gateway::bindUid($client_id, $uid)將client_id與當前uid(使用者id或者客戶端唯一標識)繫結。如果有群組、群發功能,也可以利用Gateway::joinGroup($client_id, $group_id)將client_id加入到對應分組
  5. 頁面發起的所有請求都直接post/get到mvc框架統一處理,包括髮送訊息
  6. mvc框架處理業務過程中需要向某個uid或者某個群組傳送資料時,直接呼叫GatewayClient的介面Gateway::sendToUid Gateway::sendToGroup 等傳送即可

三、實現—配置和開啟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");
}
// 標記是全域性啟動
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();

3. start_gateway.php

  • 在ApplicationsYourAppstart_gateway.php中可以編輯
// 部分檔案內容
//將$gateway改成websocket協議,demo中是text協議
$gateway = new Gateway("websocket://0.0.0.0:8282");

4.start_register.php

  • 需要注意start_register.php 中$register必須是text協議,同時需要注意埠
// register 服務必須是text協議
$register = new Register('text://192.168.124.125:1238');

5. 配置好後,開啟start.php

$ php start.php start

六、實現-服務端開發

上面提到了,使用者只有在觸發連線的時候才經過gateway的onConnect($client_id),而所有的業務操作都應該在web系統中實現。

因此我建立了一個GatewatServer.php的controller,負責處理這些業務

<?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('loginuser');
        $roomId=intval(trimAll($request->post('room')));
        $clientId=trimAll($request->post('client_id'));
        // 接受到上面的三個引數,進行分組操作
        Gateway::$registerAddress = '192.168.124.125:1238';
        // client_id與uid繫結
        // Gateway::bindUid($clientId, $userGuid);
        // 加入某個群組(可呼叫多次加入多個群組) 將clientid加入roomid分組中
        Gateway::joinGroup($clientId
            
           

相關推薦

使用Gateway-Worker實現分組實時聊天 結合第三方tp

geb wid 監聽 快速 多人 app 綁定 %20 發送數據 一、基礎知識1、Workerman是一款純PHP開發的開源高性能的PHP socket 服務器框架。被廣泛的用於手機app、移動通訊等領域的開發。 支持TCP長連接,支持Websocket、HTTP等協議,支

使用Gateway-Worker實現分組實時聊天

一、基礎1. workermanworkerman是國人開發的良心高效能的PHP socket 伺服器框架,在全球最大同性交友平臺gayHub的star都4K多,可以想象是多麼的牛X。可以單獨部署,也可以整合進MVC的框架(TP,laravel等),可以說非常實用,併發效果也

Android端實現音視訊聊天應用(一)

本文轉載於資深Android開發者“東風玖哥”的部落格。 本系列文章分享了基於Agora SDK 2.1實現多人視訊通話的實踐經驗。 轉載已經過原作者許可。原文地址 自從2016年,鼓吹“網際網路寒冬”的論調甚囂塵上,2017年亦有愈演愈烈之勢。但連麥直播、線上抓娃

WebSocket實現實時聊天

chat.html: <!DOCTYPE html> <html> <head>     <meta name="author" content="Yeeku.H.Lee(CrazyIt.org)" />     <me

1024_(即時通訊)使用node.js和socket.io實現聊天

使用node.js和socket.io實現多人聊天室 2015年01月24日 03:24:54 遠古大猛獁 閱讀數:2775 轉自: http://www.cnblogs.com/flyoung2008/archive/2012/07/19/2600132.html

基於flask框架,使用websocket實現聊天室功能

後端程式碼:   # web_socket 的收發機制 # web_socket --> web + socket --> http協議 + socket # web_socket協議就是ws協議 # 基於flask框架為web_socket提供服務 from flas

java 網路編輯實現聊天

java 網路編輯實現多人聊天。 1、網路程式設計主要是指完成C/S程式的開發,程式的開發結構有兩種: C/S(客戶端/伺服器),開發兩套程式,兩套程式需要同時維護。 B/S(瀏覽器/伺服器),開發一套程式,客戶端使用瀏覽器進行訪問。 2、C/S程式主要可

Spring Boot學習分享(七)——整合WebSocket開發聊天線上實時通訊

(一)使用原生WebSocket的註解編寫服務端 由於想要實現可以統計具體線上人數,而因為想要設計成多個房間同時進行,如果使用Spring自帶的以Stomp為協議的WebSocket實現則比較繁瑣,必須配置攔截器,由於攔截器可以得到的引數比較少,必須注入其

GitHub 實現協同提交程式碼並且許可權分組管理

前言: 在上一篇文章中Android github 快速實現多人協作 (http://www.cnblogs.com/zhaoyanjun/p/5829142.html)介紹瞭如何快速的實現多人協作的功能。 其優點是:操作簡單,快速上手。缺點是:沒有辦法實現許可權控制。為啥要許可權控制?這是一個蛋

C#實現視訊聊天

      在 《C#實現多人語音聊天》一文釋出後,很多朋友建議我也實現一個視訊聊天室給他們參考一下,其實,視訊聊天室與語音聊天室的原理是差不多的,由於加入了攝像頭、視訊的處理,邏輯會繁雜一些,本文就實現一個簡單的多人視訊聊天系統,讓多個人可以進入同一個房間進行語音視訊溝通。

C#實現語音聊天

在上一篇文章 實現一個簡單的語音聊天室(多人語音聊天系統)中,我用C#實現了一個簡單的語音聊天室,並給出了原始碼下載。雖然有原始碼,但是很多朋友反映,理解起來還是有些模糊、不夠清楚。現在想來,是因為我忘

Office 365實現在線編輯同一個文檔(下)

雲計算 雲服務 接下來我要實現多人編輯同一個Excel文件,這裏以Source.xlsx為例,右鍵選擇共享 設置共享權限以及共享給誰 權限有如下,如果是發送給別人看,就選擇任何人(可向收到此鏈接的任何人授予訪問權限,無論他們是直接收到你的鏈接到還是收到其他人轉發的鏈接。這可能包括組織外部的人員),

Office 365實現在線編輯同一個文檔(中)

雲計算 雲服務 我編輯下這個Excel錄入一些數據,如下 我點擊文件保存,可以選擇直接保存到OneDrive也可以選擇保存到本地計算機上,這裏我選擇保存到OneDrive裏 輸入文件名稱點擊保存 如果要保存到本地計算機位置,請點擊“這臺電腦” 保存好以後,可以在網頁版中登錄自己的Office

Vue+Websocket實現在線王者飛機(一)

Vue requestAnimationFra 飛機大戰 WebSocket 看了Vue官方教程(貌似和自己寫的框架差別不大,聽前前端同事一直吹Vue,於是學習了一下,和自己寫的框架好像也沒強哪裏去嘛,就是要傲嬌哈哈),等有空也整理自己的框架,開源好了),想找個項目練練手(沒找到好的),就寫個

Python實戰:打造線上匿名聊天的小程式!

最近看到好多設計類網站, 都提供了多人線上匿名聊天的小功能, 感覺很有意思, 於是自己就用django框架寫了一個, 支援手動實時更名, 學習Python中有不明白推薦加入交流裙               &

深入理解javascript非同步程式設計障眼法&&h5 web worker實現執行緒

0.從一道題說起 var t = true; setTimeout(function(){ t = false; }, 1000); while(t){ } alert('end'); 問,以上程式碼何時alert“end”呢? 測試一下:答案是:

gitlab實現協同

1.註冊登陸gitlab官網,配置個人資訊 可以選擇github賬號登陸,登陸成功在個人中心設定SSH金鑰(很關鍵),設定密碼 設定成功後,新增一個project 2.建立專案 建立成功,進入專案介面 這裡,可以建立新分支,可以和你的小夥伴們協同

一款大型線上實時經濟戰略的 EOS 遊戲——探礦者(Prospectors)

探礦者是第一個具有真實性的經濟,多玩家,實時戰略貿易和經濟關係。遊戲事件發生在類似於地球的虛擬世界中 19 世紀中葉,在初始資本形成的時代。 有關無人居住的北部土地上豐富的金礦的訊息已經傳開。它引起了人們的興趣,為了尋求快速的個人利益,大量的冒險家。金礦工的大篷車是向北

Android github 快速實現協作

前言:最近要做github多人協作,也就是多人開發。搜尋了一些資料,千篇一律,而且操作麻煩。今天就整理一下,github多人協作的簡單實現方法。  下面的教程不會出現:公鑰、組織、team、pull request 1、首先小張在github上建立一個倉庫,比如叫做: GlideDemo     

從零學習遊戲伺服器開發(一) 從一款聯機實時對戰遊戲開始

寫在前面的話      經常有學生或者初學者問我如何去閱讀和學習一個開源軟體的程式碼,也有不少朋友在工作崗位時面對前同事留下的專案,由於文件不完善、程式碼註釋少、工程數量大,而無從下手。本文將來通過一個多人聯機實時對戰遊戲——最後一戰,來解答以上問題。      其實,我以上