WebSocket之GatewayWorker使用說明

首發於我的博客 https://www.axie.cc/article/51

參考文檔:

http://www.workerman.net/gate...php

1.下載:

界面以下圖:

根據本身的運行環境下載相應的版本:二者除了啓動方式不同,其它文件都同樣html

  • windows版本啓動方式:運行下載下來的GatewayWorker-for-winstart_for_win.bat批處理文件
  • Linux版本啓動方式:運行GatewayWorkerstart.php文件, // 全局啓動腳本,此腳本會依次加載Applications/項目/start_*.php啓動腳本

2.目錄結構:

├── 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處理業務邏輯。
本地鏈接,相似邏輯代碼:web

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0 user-scalable=no">
    <title>溝通中</title>
</head>
<body>
<script>
    var fromid = 4798;//用戶實際IDa
    //// 與GatewayWorker創建websocket鏈接,域名和端口改成你實際的域名端口
    ws = new WebSocket("ws://127.0.0.1:7272");
    // 服務端主動推送消息時會觸發這裏的onmessage
    ws.onmessage = function(e){
        console.log("onmessage_begin");
         // json數據轉換成js對象
         var data = JSON.parse(e.data);
        var type = data.type || '';
        switch (type){
            case 'ping':
                ws.send('{"type":"pong"}');
                console.log("onmessage_ping");
                console.log(data.msg);
                break;
            // Events.php中返回的init類型的消息,實際運用時,能夠將client_id發給後臺進行uid綁定
            case 'init':
                console.log("onmessage_init");
                console.log(data.msg);
                break;
            case 'close':
                console.log("非法接入client");
                console.log(data.msg);
                break;
        }
    }

</script>
</body>
</html>

2.經過GatewayClient發送的數據不會通過Event.php,而是直接經由Gateway進程轉發給客戶端。GatewayClient沒法接收客戶端發來的數據。
示例代碼:json

Gateway::$registerAddress = '127.0.0.1:1238';
$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便可。windows

3.運行測試:

1.運行gateway.php
2.start_gateway.php文件,這個文件是默認的文件,默認協議是text協議:服務器

// gateway 進程,這裏使用Text協議,能夠用telnet測試
$gateway = new Gateway("Text://0.0.0.0:8282");
//想用js鏈接狀況下:
$gateway = new Gateway("ws://0.0.0.0:8282");

3.本地測試text協議是否正常命令,cmd運行:websocket

telnet 127.0.0.1 8282

界面顯示:

4.從新打開一個窗口:window測試結果:

5.Linux 測試結構:

6.測試成功!框架

開始實戰:

咱們只要對這四個文件進行了解:socket

├── Applications // 這裏是全部開發者應用項目
│   └── YourApp  // 其中一個項目目錄,目錄名能夠自定義
│       ├── Events.php // 開發者只須要關注這個文件
│       ├── start_gateway.php // gateway進程啓動腳本,包括端口號等設置
│       ├── start_businessworker.php // businessWorker進程啓動腳本
│       └── start_register.php // 註冊服務啓動腳本

1.修改start_gateway.php文件的這句配置,換成本身喜歡的協議與接口測試

// gateway 進程,這裏使用Text協議,能夠用telnet測試
$gateway = new Gateway("Websocket://0.0.0.0:7272");

2.修改Events.php 響應數據

//部分代碼
class Events
{
    static  $num = 0;

    /**
     * 當客戶端鏈接時觸發的事件。
     * @param $client_id
     */
    public static function onConnect($client_id)
    {
        global $num;
        Gateway::sendToClient($client_id, json_encode(array(
            'type'      => 'init',
            'msg' => $client_id
        )));

    }

   /**
    * 有消息時
    * @param int $client_id
    * @param mixed $message
    */
   public static function onMessage($client_id, $message)
   {
       // 客戶端傳遞的是json數據
       $message_data = json_decode($message, true);
       if(!$message_data)
        {
           return ;
        }
       switch($message_data['type']){
           case "bind":
               $fromid = $message_data['fromid'];
               Gateway::bindUid($client_id, $fromid);
               Gateway::sendToUid($message_data['fromid'],json_encode(['type'=>'bind','msg'=>'綁定成功'])); //返回給發送者
               return;
        }
        //其它case 狀況
    }
    /**
    * 當用戶斷開鏈接時觸發
    * @param int $client_id 鏈接id
    */
   public static function onClose($client_id)
   {
       // 向全部人發送 
       GateWay::sendToAll("$client_id logout\r\n");
   }
}

3. 在html中調用,觀察console的數據

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0 user-scalable=no">
    <title>溝通中</title>
</head>
<body>
<script>
    var fromid = 4798;//用戶實際IDa
    //// 與GatewayWorker創建websocket鏈接,域名和端口改成你實際的域名端口
    ws = new WebSocket("ws://127.0.0.1:7272");
    // 服務端主動推送消息時會觸發這裏的onmessage
    ws.onmessage = function(e){
        console.log("onmessage_begin");
         // json數據轉換成js對象
         var data = JSON.parse(e.data);
        var type = data.type || '';
        switch (type){
            case 'ping':
                ws.send('{"type":"pong"}');
                console.log("onmessage_ping");
                console.log(data.msg);
                break;
            // Events.php中返回的init類型的消息,實際運用時,能夠將client_id發給後臺進行uid綁定
            case 'init':
                console.log("onmessage_init");
                console.log(data.msg);
                break;
            case 'close':
                console.log(data.msg);
                break;
        }
    }

</script>
</body>
</html>

注意:註冊端口
文件:ApplicationsYourAppstart_register.php ApplicationsYourAppstart_gateway.php ApplicationsYourAppstart_businessworker.php
中的註冊地址要同樣

//start_register.php
// 服務註冊地址
$gateway->registerAddress = '127.0.0.1:1238';

//start_businessworker.php
// 服務註冊地址
$worker->registerAddress = '127.0.0.1:1238';

//start_register.php
// register 必須是text協議
$register = new Register('text://0.0.0.0:1238');
相關文章
相關標籤/搜索