http://www.workerman.net/gate...php
界面以下圖:
根據本身的運行環境下載相應的版本:二者除了啓動方式不同,其它文件都同樣html
├── 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
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');