workerman 從伺服器端向用戶端推送訊息程式碼
阿新 • • 發佈:2019-02-09
資料推送
<?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>