摘要:環境擴展需求實現簡單的廣播支持身份驗證源碼廢話少說,上代碼使用實例就會以守護進程方式運行客戶端代碼搭建過程非常方便。實現的比較簡陋,但是可以滿足一般的需求了。支持身份驗證功能,驗證不通過會自動踢掉。
環境
php5.6+
swoole擴展
需求實現簡單的廣播, 支持身份驗證
源碼廢話少說,上代碼.
host = $host; $this->port = $port; $this->config = $config; $this->init(); } public function init() { $this->server = new Server($this->host, $this->port); !empty($this->config) && $this->server->set($this->config); $this->beforeSendMsgCallback = function() {}; $this->afterSendMsgCallback = function() {}; $this->beforeAuthCallback = function() {}; $this->afterAuthCallback = function() {}; $this->authenticator = function() {}; $this->bindEvents(); } public function bindEvents() { $this->server->on("open", [$this, "onOpen"]); $this->server->on("message", [$this, "onMessage"]); $this->server->on("close", [$this, "onClose"]); } public function run() { $this->server->start(); } public function onOpen(Server $server, $request) { call_user_func($this->beforeAuthCallback, $server, $request); if (!$this->auth($request)) { return; } $this->customers[] = $request->fd; call_user_func($this->afterAuthCallback, $server, $request); } public function onMessage(Server $server, $frame) { call_user_func($this->beforeSendMsgCallback, $server, $frame); $this->broadcast($frame->fd, $frame->data); call_user_func($this->afterSendMsgCallback, $server, $frame); } public function onClose($ser, $fd) { $key = array_search($fd, $this->customers); unset($this->customers[$key]); } public function __call($method, $params) { $class_name = get_class($this->server); $class = new ReflectionClass($class_name); try { $class->getMethod($method); } catch (ReflectionException $e) { echo "Method $method is not exists "; return; } call_user_func_array([$this->server, $method], $params); } public function broadcast($fromUser, $messages) { $users = array_diff($this->customers, [$fromUser]); foreach ($users as $user) { $this->server->push($user, $messages); } } private function auth($request) { if (($result = call_user_func($this->authenticator, $request)) === false) { $this->server->push($request->fd, "auth failed"); $this->server->close($request->fd); } return $result; } }使用實例
1, ]); $server->authenticator = function($request) use ($server) { $get = $request->get; return empty($get) || ($get["access_token"] == "access_token"); }; $server->afterAuthCallback = function($ser, $request) use ($server) { $server->push($request->fd, "auth successful"); }; $server->run();
php index.php #就會以守護進程方式運行
客戶端js代碼:
var websocket = new WebSocket("ws://192.168.2.106:9501?access_token=access_token"); websocket.onopen=function(evt) { }; websocket.onmessage = function(evt) { console.log(evt); }; websocket.onclose = function(evt) { console.log(evt); };
搭建過程非常方便。實現的比較簡陋,但是可以滿足一般的需求了。支持身份驗證功能,驗證不通過會自動踢掉。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/25591.html
摘要:目錄初識創建服務器上創建服務器下異步任務持續更新中。。。參加工作有一段時間了,偶爾會聽到,對我這種小白粗略看下文檔都會覺得很牛逼。個人理解就是解決這樣應用場景的。 目錄 初識Swoole 創建服務器(上) 創建服務器(下) 異步任務task 持續更新中。。。 參加工作有一段時間了,偶爾會聽到swoole,對我這種PHP小白粗略看下文檔都會覺得很牛逼。由于學習成本比較高,自身對網絡異...
摘要:出題思路本次題目來自于我的一個外包項目實踐。回合制比賽以分鐘為一回合。選手在比賽過程中需要盜取到對手的密鑰,以竊聽他方內容,并修改己方密鑰以放泄露動態該部分同樣由中心服務器與完成。 Author: RytiaDate: 20190427Blog: www.zzfly.net本人才學疏淺,望君不吝賜教 背景 受學校老師邀請,為學弟學妹舉辦分享會介紹 AWD 相關經驗,本人一時頭腦風暴采用...
摘要:那么,是否就無法用來開發雙向通信的應用呢答案是否定的。內置通信支持,可以與程序基于進行雙向通信。通信協議于年被定為標準,并由補充規范。前言 眾所周知,PHP用于開發基于HTTP協議的網站應用非常便捷。而HTTP協議是一種單向的通信協議,只能接收客戶端的請求,然后響應請求,不能主動向客戶端推送信息。因此,一些實時性要求比較高的應用,如實時聊天、直播應用、在線網頁游戲等,就不適合采用HTTP協議...
摘要:那么,是否就無法用來開發雙向通信的應用呢答案是否定的。內置通信支持,可以與程序基于進行雙向通信。通信協議于年被定為標準,并由補充規范。前言 眾所周知,PHP用于開發基于HTTP協議的網站應用非常便捷。而HTTP協議是一種單向的通信協議,只能接收客戶端的請求,然后響應請求,不能主動向客戶端推送信息。因此,一些實時性要求比較高的應用,如實時聊天、直播應用、在線網頁游戲等,就不適合采用HTTP協議...
摘要:是一個請求對象,包含了客戶端發來的握手請求信息事件函數中可以調用向客戶端發送數據或者調用關閉連接事件回調是可選的當服務器收到來自客戶端的數據幀時會回調此函數。 前言:了解概念之后就應該練練手啦,不然就是巨嬰 有收獲的話請加顆小星星,沒有收獲的話可以 反對 沒有幫助 舉報三連 代碼倉庫 實戰swoole【聊天室】 在線體驗 準備工作 需要先看初識swoole【上】,了解基本的服務端...
閱讀 1858·2021-09-22 15:45
閱讀 1639·2019-08-30 15:55
閱讀 1829·2019-08-29 11:16
閱讀 3302·2019-08-26 11:44
閱讀 702·2019-08-23 17:58
閱讀 2698·2019-08-23 12:25
閱讀 1624·2019-08-22 17:15
閱讀 3597·2019-08-22 16:09