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");
    // 服務端主動推送消息時會觸發這里的onmessage
    ws.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");
    // 服務端主動推送消息時會觸發這里的onmessage
    ws.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.php
 Gateway::bindUid($clientId,$uid);
 Gateway::sendToAll(json_encode($clientId));

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM