WebSocket實戰之————GatewayWorker使用筆記例子

?參考文檔:http://www.workerman.net/gatewaydoc/

目錄結構

├── Applications // 這里是所有開發者應用項目
│   └── YourApp  // 其中一個項目目錄,目錄名可以自定義
│       ├── Events.php // 開發者只需要關注這個文件
│       ├── start_gateway.php // gateway進程啟動腳本,包括端口號等設置
│       ├── start_businessworker.php // businessWorker進程啟動腳本
│       └── start_register.php // 注冊服務啟動腳本
│
├── start.php // 全局啟動腳本,此腳本會依次加載Applications/項目/start_*.php啟動腳本
│
└── vendor    // GatewayWorker框架和Workerman框架源碼目錄,此目錄開發者不用關心

!!!特別注意:

[1]客戶端的事件及數據全部由Gateway轉發給BusinessWorker處理,BusinessWorker默認調用Events.php中的onConnect onMessage onClose處理業務邏輯。

<script language="javascript" type="text/javascript">var $URL = "__APP__/Home/GatewayWorker/bindUid";// 與GatewayWorker建立websocket連接,域名和端口改為你實際的域名端口ws = new WebSocket("ws://127.0.0.1:8384");// 服務端主動推送消息時會觸發這里的onmessagews.onmessage = function(e){// json數據轉換成js對象var data = eval("("+e.data+")");var type = data.type || '';switch(type){// Events.php中返回的init類型的消息,將client_id發給后臺進行uid綁定case 'init':// 利用jquery發起ajax請求,將client_id發給后端進行uid綁定$.post($URL, {client_id: data.clientId}, function(data){}, 'json');break;default :alert(e.data);}};
</script>

[2]通過GatewayClient發送的數據不會經過Event.php,而是直接經由Gateway進程轉發給客戶端。GatewayClient無法接收客戶端發來的數據。

Gateway::$registerAddress = '127.0.0.1:1236';
$message = ['type' => 4002,'clientId' => $clientId,'publish_time' => date('Y-m-d h:i:s', time())];
Gateway::bindUid($clientId,$uid);
//在這里發送的信息是不走Event.php文件的,直接廣播出去了
Gateway::sendToClient($clientId,json_encode($message));

如果GatewayClient和GatewayWorker不是在同一臺服務器上,則需要先將start_gateway.php中的lanIp改成當前服務器的內網ip(如果不在一個內網可改成公網ip)。
如果GatewayClient和GatewayWorker在同一臺服務器上運行,則不用做任何更改,直接按照示例使用GatewayClient即可。

一、start_gateway.php文件,這個文件是默認的文件,默認協議是text協議:

// gateway 進程,這里使用Text協議,可以用telnet測試
$gateway = new Gateway("Text://0.0.0.0:8383");

本地測試text協議是否正常命令:

telnet 127.0.0.1 8383

二、測試結果,啟動服務器

輸入命令:

telnet 127.0.0.1 8282

重新打開一個窗口:Windows 測試結果:

Linux測試結果:

測試成功:

三、自定義一個Websocket連接

例如:copy一個start_gateway_ws.php文件,如圖所示:

修改文件內容:

// gateway_ws 進程
$gateway_ws = new Gateway("Websocket://0.0.0.0:8384");
// gateway名稱,status方便查看
$gateway_ws->name = 'YourAppGatewayWS';

在HTMl頁面調用:

<script language="javascript" type="text/javascript">var $URL = "__APP__/Home/GatewayWorker/bindUid";console.log($URL);// 與GatewayWorker建立websocket連接,域名和端口改為你實際的域名端口ws = new WebSocket("ws://127.0.0.1:8384");// 服務端主動推送消息時會觸發這里的onmessagews.onmessage = function(e){// json數據轉換成js對象var data = eval("("+e.data+")");var type = data.type || '';switch(type){case 'init':$.post($URL,$data,success,'json');break;default :alert(e.data);}};</script>

四、start_businessworker.php文件

注意:以上的HTML頁面的WebSocket的端口號必須的同時對應哦!

// 服務注冊地址
$worker->registerAddress = '你的外網IP地址:1236';

可以看出:start_register.php這個文件是專門管理其他的三個文件的

注意:一下的register和worker的這個注冊地址必須是一樣的,也就是說,worker的注冊地址必須和register的一樣的

// register 服務必須是text協議
$register = new Register('text://0.0.0.0:1236');
// 服務注冊地址
$worker->registerAddress = '120.120.120.120:1236';

?例如在TP的Controller中使用的時候這樣連接:調用的是這個文件中的地址(服務注冊地址):start_businessworker.php

 Gateway::$registerAddress = '120.120.120.120:1236'; //這個鏈接的地址是start_register.phpGateway::bindUid($clientId,$uid);Gateway::sendToAll(json_encode($clientId));

?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/457392.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/457392.shtml
英文地址,請注明出處:http://en.pswp.cn/news/457392.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

[轉]關于凸優化的一些簡單概念

沒有系統學過數學優化&#xff0c;但是機器學習中又常用到這些工具和技巧&#xff0c;機器學習中最常見的優化當屬凸優化了&#xff0c;這些可以參考Ng的教學資料&#xff1a;http://cs229.stanford.edu/section/cs229-cvxopt.pdf&#xff0c;從中我們可以大致了解到一些凸優化…

Go 1.18.1 Beta 嘗鮮 泛型 FuzzTest workspace mode

Go 1.18.1 Beta 嘗鮮 昨天&#xff0c;go 終于發布了 1.18 的 beta 版本, 帶來了大家期待已久的泛型&#xff0c;抓緊時間康康能不能趕上熱乎的。 下載地址 根據社區昨天發的 Go 1.18 Beta 1 is available, with generics 這次版本更新主要帶來的新功能有&#xff1a; 泛型模…

centos7部署兩個mysql_一文掌握mysql實用工具--pt-online-schema-change、innotop部署

概述因為OSC和innotop這兩個需要的依賴包比較接近&#xff0c;所以這次就寫一起了&#xff0c;下面介紹下完整的部署教程&#xff0c;以下基于centos7操作系統。官網文檔&#xff1a;http://dev.mysql.com/doc/refman/5.7/en/innodb-create-index-overview.htmlOSC&#xff1a;…

python面試題目

問題一&#xff1a;以下的代碼的輸出將是什么? 說出你的答案并解釋。 1234567891011121314class Parent(object):x 1class Child1(Parent):passclass Child2(Parent):passprint Parent.x, Child1.x, Child2.xChild1.x 2print Parent.x, Child1.x, Child2.xParent.x 3print …

修改頁面后獲得flag_互動征集丨是時候為2021立flag了

2020馬上就要過去了今年的flag各位小伙伴實現了多少&#xff1f;翻出了生灰的flag擦擦說不定2021還能接著用哦2020年就要過去了還記得你在年初立下的那些Flag嗎&#xff1f;減肥“明天我就開始減肥&#xff01;”是大部分人在大部分時候都掛在嘴邊的一句話疫情宅家不僅沒減成還…

Python3.10 結構化模式匹配 PEP 634

Python3.10 結構化模式匹配 PEP 634 眼看 2021 馬上結束&#xff0c;python 發布了它的 3.10 版本&#xff0c;優化了錯誤消息&#xff0c;上下文管理器等內容&#xff0c;但更吸引我的還是結構化模式匹配。 眾所周之 switch 一直是 python 社區呼聲比較高的一個功能&#xff…

為ESXI 添加ISCSI存儲設備 Linux服務器系統

為ESXI 添加ISCSI存儲設備 Linux系統本文使用的LINUX 6系統上一塊硬盤制作的ISCSI存儲設備其IP地址為&#xff1a;192.168.26.218:在系統上直接輸入&#xff1a;yum -y install scsi-target-utils 命令 安裝 iscsi分區設置我們將SDD這塊硬盤的SDD1作為iscsi存儲設備編輯ISCSI配…

出棧順序 與 卡特蘭數(Catalan)的關系

一&#xff0c;問題描述 給定一個以字符串形式表示的入棧序列&#xff0c;請求出一共有多少種可能的出棧順序&#xff1f;如何輸出所有可能的出棧序列&#xff1f; 比如入棧序列為&#xff1a;1 2 3 &#xff0c;則出棧序列一共有五種&#xff0c;分別如下&#xff1a;1 2 3、…

[譯] Bounds Check Elimination 邊界檢查消除

[譯] Bounds Check Elimination 邊界檢查消除 Go 是一種內存安全的語言&#xff0c;在針對數組 (array) 或 Slice 做索引和切片操作時&#xff0c;Go 的運行時&#xff08;runtime&#xff09;會檢查所涉及的索引是否超出范圍。如果索引超出范圍&#xff0c;將產生一個 Panic&…

cad多段線畫圓弧方向_CAD箭頭怎么畫

CAD箭頭怎么畫問&#xff1a;CAD箭頭怎么畫&#xff1f;答&#xff1a;想要回答CAD箭頭怎么畫這個問題&#xff0c;得先從CAD多段線命令說起&#xff0c;畫箭只是多段線的一種應用。執行CAD多段線命令的三種方式1.單擊菜單欄上的"繪圖">>"多段線"。2…

HDU 5410 CRB and His Birthday ——(完全背包變形)

對于每個物品&#xff0c;如果購買&#xff0c;價值為A[i]*xB[i]的背包問題。 先寫了一發是WA的 。代碼如下&#xff1a; 1 #include <stdio.h>2 #include <algorithm>3 #include <string.h>4 #include <set>5 using namespace std;6 typedef pair<…

一篇講Java指令重排和內存可見性的好文

在這里&#xff1a; http://tech.meituan.com/java-memory-reordering.html 指令重排和內存可見性&#xff08;緩存不一致&#xff09;是兩個不同的問題。 volatile關鍵字太強&#xff0c;即阻擋指令重排&#xff0c;又保證內存一致性。 unsafe.putOrderedXXX()只阻擋指令重排&…

php 獲取delete蠶絲_php結合Redis實現100萬用戶投票項目,并實時查看到投票情況的案例...

場景&#xff1a;某網站需要對其項目做一個投票系統&#xff0c;投票項目上線后一小時之內預計有100萬用戶進行投票&#xff0c;希望用戶投票完就能看到實時的投票情況這個場景可以使用redismysql冷熱數據交換來解決。何為冷熱數據交換&#xff1f;冷數據&#xff1a;之前使用的…

硬件內存模型 Hardware Memory Models

硬件內存模型 Hardware Memory Models (Memory Models, Part 1) Posted on Tuesday, June 29, 2021. 簡介&#xff1a;童話的終結 很久以前&#xff0c;當人們還在寫單線程程序的時候&#xff0c;讓程序跑的更快的一個最有效的辦法就是什么也不做&#xff0c;因為下一代硬件…

碰到日期題就怕的我來寫一道水題吧

HDOJ-2005&#xff0c; http://acm.hdu.edu.cn/showproblem.php?pid2005 20XX系列的水題哈哈&#xff0c;寫了二十分鐘&#xff0c;就為找到一種比較正常不傻逼的寫法。。。 嗯&#xff0c;學習了一下&#xff0c;閏年的判斷可以寫成一個接受參數的宏。 #define lev(n) (n%40&…

判斷是否為gif/png圖片的正確姿勢

判斷是否為gif/png圖片的正確姿勢 1.在能取到圖片后綴的前提下 123456789//假設這是一個網絡獲取的URLNSString *path "http://pic3.nipic.com/20090709/2893198_075124038_2.gif";// 判斷是否為gifNSString *extensionName path.pathExtension;if ([extensionName…

【Go】Map 的空間利用率統計

Go 中 map 利用率 今天刷 B 站看見有 Up 主在講布隆過濾器&#xff0c;提到了利用率的問題&#xff0c;假設有一組數據&#xff0c;范圍分布非常廣&#xff0c;使用布隆過濾器時如何盡量少的減少內存使用&#xff0c;感覺除了針對特定數據的定向優化外沒什么特別好的辦法&…

ap模式和sta模式共存_AP+AC組網下的本地轉發及集中轉發

現在越來越多的企業都有自己的無線網絡&#xff0c;而無線網絡的組網方式一般都是使用ACAP模式進行組網&#xff0c;使用無線網絡能夠提供經濟、高效的網絡接入方式。相比有線網絡&#xff0c;無線網絡下只要能接入無線網的地方都可以使用網絡&#xff0c;用戶可以自由移動。而…

《JS權威指南學習總結--6.7屬性的特性》

內容要點&#xff1a; 一.ES5中查詢和設置屬性的API 1.可以通過這些API給原型對象添加方法&#xff0c;并將它們設置成不可枚舉的&#xff0c;這讓它們看起來更像內置方法。 2.可以通過這些API給對象定義不能修改或刪除的屬性&#xff0c;借此 "鎖定" 這個對象。 3.數…

【干貨分享】流程DEMO-事務呈批表

流程名&#xff1a; 事務呈批表 業務描述&#xff1a; 辦公采購、會議費用等事務的申請。流程發起時&#xff0c;會檢查預算&#xff0c;如果預算不夠&#xff0c;將不允許發起費用申請&#xff0c;如果預算夠用&#xff0c;將發起流程&#xff0c;同時占用相應金額的預算&…