WebSocket实战之————GatewayWorker使用笔记例子
?參考文檔:http://www.workerman.net/gatewaydoc/
目錄結(jié)構(gòu)
├── Applications // 這里是所有開發(fā)者應(yīng)用項目 │ └── YourApp // 其中一個項目目錄,目錄名可以自定義 │ ├── Events.php // 開發(fā)者只需要關(guān)注這個文件 │ ├── start_gateway.php // gateway進程啟動腳本,包括端口號等設(shè)置 │ ├── start_businessworker.php // businessWorker進程啟動腳本 │ └── start_register.php // 注冊服務(wù)啟動腳本 │ ├── start.php // 全局啟動腳本,此腳本會依次加載Applications/項目/start_*.php啟動腳本 │ └── vendor // GatewayWorker框架和Workerman框架源碼目錄,此目錄開發(fā)者不用關(guān)心!!!特別注意:
[1]客戶端的事件及數(shù)據(jù)全部由Gateway轉(zhuǎn)發(fā)給BusinessWorker處理,BusinessWorker默認調(diào)用Events.php中的onConnect onMessage onClose處理業(yè)務(wù)邏輯。
<script language="javascript" type="text/javascript">var $URL = "__APP__/Home/GatewayWorker/bindUid";// 與GatewayWorker建立websocket連接,域名和端口改為你實際的域名端口ws = new WebSocket("ws://127.0.0.1:8384");// 服務(wù)端主動推送消息時會觸發(fā)這里的onmessagews.onmessage = function(e){// json數(shù)據(jù)轉(zhuǎn)換成js對象var data = eval("("+e.data+")");var type = data.type || '';switch(type){// Events.php中返回的init類型的消息,將client_id發(fā)給后臺進行uid綁定case 'init':// 利用jquery發(fā)起ajax請求,將client_id發(fā)給后端進行uid綁定$.post($URL, {client_id: data.clientId}, function(data){}, 'json');break;default :alert(e.data);}}; </script>[2]通過GatewayClient發(fā)送的數(shù)據(jù)不會經(jīng)過Event.php,而是直接經(jīng)由Gateway進程轉(zhuǎn)發(fā)給客戶端。GatewayClient無法接收客戶端發(fā)來的數(shù)據(jù)。
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); //在這里發(fā)送的信息是不走Event.php文件的,直接廣播出去了 Gateway::sendToClient($clientId,json_encode($message));如果GatewayClient和GatewayWorker不是在同一臺服務(wù)器上,則需要先將start_gateway.php中的lanIp改成當前服務(wù)器的內(nèi)網(wǎng)ip(如果不在一個內(nèi)網(wǎng)可改成公網(wǎng)ip)。
如果GatewayClient和GatewayWorker在同一臺服務(wù)器上運行,則不用做任何更改,直接按照示例使用GatewayClient即可。
一、start_gateway.php文件,這個文件是默認的文件,默認協(xié)議是text協(xié)議:
// gateway 進程,這里使用Text協(xié)議,可以用telnet測試 $gateway = new Gateway("Text://0.0.0.0:8383");本地測試text協(xié)議是否正常命令:
telnet 127.0.0.1 8383二、測試結(jié)果,啟動服務(wù)器
輸入命令:
telnet 127.0.0.1 8282重新打開一個窗口:Windows 測試結(jié)果:
Linux測試結(jié)果:
測試成功:
三、自定義一個Websocket連接
例如:copy一個start_gateway_ws.php文件,如圖所示:
修改文件內(nèi)容:
// gateway_ws 進程 $gateway_ws = new Gateway("Websocket://0.0.0.0:8384"); // gateway名稱,status方便查看 $gateway_ws->name = 'YourAppGatewayWS';在HTMl頁面調(diào)用:
<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");// 服務(wù)端主動推送消息時會觸發(fā)這里的onmessagews.onmessage = function(e){// json數(shù)據(jù)轉(zhuǎn)換成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的端口號必須的同時對應(yīng)哦!
// 服務(wù)注冊地址 $worker->registerAddress = '你的外網(wǎng)IP地址:1236';可以看出:start_register.php這個文件是專門管理其他的三個文件的
注意:一下的register和worker的這個注冊地址必須是一樣的,也就是說,worker的注冊地址必須和register的一樣的
// register 服務(wù)必須是text協(xié)議 $register = new Register('text://0.0.0.0:1236'); // 服務(wù)注冊地址 $worker->registerAddress = '120.120.120.120:1236';?例如在TP的Controller中使用的時候這樣連接:調(diào)用的是這個文件中的地址(服務(wù)注冊地址):start_businessworker.php
Gateway::$registerAddress = '120.120.120.120:1236'; //這個鏈接的地址是start_register.phpGateway::bindUid($clientId,$uid);Gateway::sendToAll(json_encode($clientId));?
總結(jié)
以上是生活随笔為你收集整理的WebSocket实战之————GatewayWorker使用笔记例子的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 更新鸿蒙系统运行评价,全球首批!升级使用
- 下一篇: To install 64-bit OD