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

tinywan1227發表於2016-12-15

 參考文件: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));

 


相關文章