1. 程式人生 > >workerman 從伺服器端向用戶端推送訊息程式碼

workerman 從伺服器端向用戶端推送訊息程式碼

資料推送

<?php

$client = stream_socket_client('tcp://127.0.0.1:5678', $errno, $errmsg, 1);
// 推送的資料,包含使用者,表示是給這個使用者推送
$data = array('uid'=>'','group'=>'admin', 'message'=>'傳送成功啦');
// 傳送資料,注意5678埠是Text協議的埠,Text協議需要在資料末尾加上換行符
fwrite($client, json_encode($data)."\n");
// 讀取推送結果
echo fread($client, 8192);

接收伺服器端推送的資料並將資料傳送到客戶端

<?php
use Workerman\Worker;
require_once 'Workerman\Autoloader.php';
require_once 'Workerman\Lib\Timer.php';


$worker = new Worker('websocket://127.0.0.1:1234');
$worker->count = 1;
// worker程序啟動後建立一個內部通訊埠
$worker->onWorkerStart = function($worker)
{
    // 開啟一個內部埠,方便內部系統推送資料,Text協議格式 文字+換行符
    $inner_text_worker = new Worker('Text://127.0.0.1:5678');
    $inner_text_worker->onMessage = function($connection, $buffer)
    {
        global $worker;
        // $data陣列格式,裡面有uid,表示向那個uid的頁面推送資料
        $data = json_decode($buffer, true);
        $uid = $data['uid'];
        // 通過workerman,向uid的頁面推送資料
        $ret = sendMessageByUid($uid, $buffer);
        // 返回推送結果
        $connection->send($ret ? 'ok' : 'fail');
    };
    $inner_text_worker->listen();
};
// 新增加一個屬性,用來儲存uid到connection的對映
$worker->uidConnections = array();
// 當有客戶端發來訊息時執行的回撥函式
$worker->onMessage = function($connection, $data)use($worker)
{
    $connection->lastMessageTime = time();
    // 判斷當前客戶端是否已經驗證,既是否設定了uid
    if(!isset($connection->uid))
    {
        // 沒驗證的話把第一個包當做uid(這裡為了方便演示,沒做真正的驗證)
        $connection->uid = $data;
        /* 儲存uid到connection的對映,這樣可以方便的通過uid查詢connection,
         * 實現針對特定uid推送資料
         */
        $worker->uidConnections[$connection->uid] = $connection;
        return;
    }
};

// 當有客戶端連線斷開時
$worker->onClose = function($connection)use($worker)
{
    global $worker;
    if(isset($connection->uid))
    {
        // 連線斷開時刪除對映
        unset($worker->uidConnections[$connection->uid]);
    }
};

// 向所有驗證的使用者推送資料
function broadcast($message)
{
    global $worker;
    foreach($worker->uidConnections as $connection)
    {
        $connection->send($message);
    }
}

// 針對使用者推送資料
function sendMessageByUid($uid, $message)
{
    global $worker;
    var_dump($worker->uidConnections);
    if(isset($worker->uidConnections[$uid]))
    {
        $connection = $worker->uidConnections[$uid];
        $connection->send($message);
        return true;
    }
    return false;
}

// 執行所有的worker
Worker::runAll();

客戶端

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<script>
    var ws = new WebSocket('ws://127.0.0.1:1234');
    ws.onopen = function(){
        var uid = (new Date()).getTime();
        var data = {'group':'admin','uid':'uid2'};
        ws.send(JSON.stringify(data));
    };
    ws.onmessage = function(e){
        if (e.data!=''){
            alert(JSON.parse(e.data));
        }
    };
</script>
</body>
</html>