1. 服务端

class WebSocketServer
{public $server;public function __construct($controller) {$this->server = new \swoole_websocket_server("0.0.0.0", 9501);$this->server->set(array('worker_num' => 8,'daemonize' => false,
//            'heartbeat_check_interval' => 30,
//            'heartbeat_idle_time' => 90,'heartbeat_check_interval' => 60,'heartbeat_idle_time' => 600,));$this->server->on('WorkerStart', array($controller, 'onWorkerStart'));$this->server->on('open', array($controller, 'onOpen'));$this->server->on('message',array($controller, 'onMessage') );$this->server->on('close',array($controller, 'onClose') );$this->server->on('request', array($controller, 'onRequest'));$this->server->on('Timer', array($controller, 'onTimer'));}public function start(){$this->server->start();}}class ServerController extends Controller
{private $fdKey='swoole_websocket_server_fd';private $userIdKey='swoole_websocket_server_userId';const GPS_POINT_KEY = "GPS:GPSPOINT";   // 实时坐标点的标识public function start(){try{$server = new WebSocketServer($this);$server->start();}catch(\Exception $e) {$this->log("websocket:Caught exception000:".$e->getMessage());}}public function onWorkerStart( $server , $worker_id){// 在Worker进程开启时绑定定时器echo "onWorkerStart\n";// 只有当worker_id为0时才添加定时器,避免重复添加if ($worker_id == 0) {$server->addtimer(1000);}}public function onTimer($server, $interval) {switch( $interval ) {case 1000: {  //echo "Do Thing A at interval 30000\n";$this->pushData($server);break;}}}public function onOpen(\swoole_websocket_server $server, $request) {echo "server: handshake success with fd{$request->fd}\n";try{$server = $request->server;$uri = trim($server['request_uri'],'/');$user = explode('/',$uri);$userId = $user[1];$redis = Cache::getInstance();$fdArr = $redis->get($this->fdKey.$userId);$fd = $request->fd;if(!empty($fdArr)){array_push($fdArr,$fd);$newFdArr = $fdArr;}else{$newFdArr = array($fd);}$redis->set($this->fdKey.$userId,$newFdArr);$redis->set($this->userIdKey.$fd,$userId);$this->log("websocket:server start, fd:".$request->fd);}catch(\Exception $e) {$this->log("websocket:Caught exception000:".$e->getMessage());}}public function onMessage(\swoole_websocket_server $server, $frame) {echo "receive from {$frame->fd}:{$frame->data},opcode:{$frame->opcode},fin:{$frame->finish}\n";try{$data = $frame->data;if($data=='close'){$redis = Cache::getInstance();$key = $this->userIdKey.$frame->fd;$userId = $redis->get($key);$redis->rm($key);$redis->rm($this->fdKey.$userId);}}catch(\Exception $e){$this->log("websocket:Caught exception111:".$e->getMessage());}}public function onClose($ser,$fd) {echo "client {$fd} closed\n";$redis = Cache::getInstance();$redis->rm('swoole_websocket_server_fd1');$key = $this->userIdKey.$fd;$userId = $redis->get($key);$redis->rm($key);$fdKey = $this->fdKey.$userId; //团队下的fd$fdArr = $redis->get($fdKey);if(!empty($fdArr)&&in_array($fd,$fdArr)){$fd = arrray($fd);$newFdArr = array_diff($fdArr,$fd);if(!empty($newFdArr)){$redis->set($fdKey,$newFdArr);}else{$redis->rm($fdKey);}}$this->log("websocket:server close:".date("Y-m-d H:i:s"));}public function onRequest($request, $response) {// 接收http请求从get获取message参数的值,给用户推送// $this->server->connections 遍历所有websocket连接用户的fd,给所有用户推送foreach ($this->server->connections as $fd) {$this->server->push($fd, $request->get['message']);}}public function pushData($server){$redis = Cache::getInstance();$all = $redis->hGetAll(self::GPS_POINT_KEY);foreach($all as $key=>$val){if(!empty($val)){list($lonlat, $gateTime) = explode('|', $val);list($lon, $lat) = explode(',', $lonlat);$latitude = "$lat";$longitude = "$lon";if($gateTime+60>time()){//60s内的算坐标更新了if(strlen($key)==11){ //手机//取得对应在线手机所在的团队id$where = ['id_card'=>$key,'state'=>1];}elseif(strlen($key)==15){ //定位神器//取得对应在线手机所在的团队id$where = ['device_imei'=>$key,'state'=>1];}$deviceData = PointDeviceService::getOnlineDevice($where);$deviceData['record'] = ['gate_time'=>date("Y-m-d H:i:s", $gateTime),'latitude'=>$latitude,'longitude'=>$longitude,];print_r($deviceData);$jsonData = json_encode($deviceData);echo $userId = $deviceData['user_id'];//团队ID$fdArr = $redis->get($this->fdKey.$userId);echo "aaa:";print_r($fdArr);if(!empty($fdArr)){foreach($fdArr as $fd){$server->push($fd,$jsonData);}}$this->log("websocket:server push data:".$jsonData);}else{$this->log("websocket:".$key."设备没有更新的坐标数据");}}}}private function log($message=''){$trueDir = RUNTIME_PATH.'websocketServer'.DIRECTORY_SEPARATOR;if(!is_dir($trueDir)){mkdir($trueDir,0777,true);}$file = date('Y_m_d').'.log';$trueFile = $trueDir.$file;$message = date("Y-m-d H:i:s").":".$message;file_put_contents($trueFile,$message.PHP_EOL,FILE_APPEND);}}

2. 客户端

function wsConnect(){// var userId = '{userId}';var wsServer = 'ws://127.0.0.1:9501/user_id/1';var websocket = new WebSocket(wsServer);return websocket;}//在地图上动态显示所有在线设备 add by mzc 2017.10.19function dynamicDisplay(){websocket =  wsConnect();websocket.onopen = function (evt) {if(websocket.readyState==1){websocket.send('user_id=1');console.log("websocket连接成功");}};websocket.onclose = function (evt) {console.log("Disconnected");if(websocket.readyState==3){websocket.send('close');wsConnect();console.log('reconnect');}};websocket.onmessage = function (evt) {console.log('服务器推送过来的数据: ' + evt.data);var data = evt.data;data = eval('(' + data + ')');var temp = [];
//            for (var i = 0; i <data.length; i++) {
//                temp.push(data[i]);
//            }temp.push(data);openInfo(temp);};websocket.onerror = function (evt, e) {console.log('Error occured: ' + evt.data);if(websocket.readyState==3){wsConnect();console.log('reconnect');}};//关闭页面时记得一定要关闭连接,否则服务端可能不会释放window.onunload = function(){websocket.close();};}

websocket 应用实例相关推荐

  1. nginx反向代理配置 多个_实例分享:Nginx学习之反向代理WebSocket配置实例

    写在开始 去年,做过一款竞赛打分的APP.具体需求,同组教师之间可以相互通信,及时通知同组人员,其他组员做了那些操作(当然,这只是针对特定操作). 实现方案 采用目前比较成熟的WebSocket技术, ...

  2. php websocket应用实例,php使用websocket示例详解

    下面我画了一个图演示 client 和 server 之间建立 websocket 连接时握手部分,这个部分在 node 中可以十分轻松的完成,因为 node 提供的 net 模块已经对 socket ...

  3. tomcat处理html流程,基于Tomcat运行HTML5 WebSocket echo实例详解

    一.概述 作为HTML5新特性之一的WebSocket组件,在实时性有一定要求的WEB应用开 发中还是有一定用武之地,高版本的IE.Chrome.FF浏览器都支持Websocket,标准的Websoc ...

  4. 使用libwebsocket搭建websocket服务器实例

    webcomm与前端的通讯-websocket服务器操作流程 #include <libwebsockets.h> #include <pthread.h> #include ...

  5. java js websocket_java js实现Websocket通讯实例

    本文主要介绍如何使用java实现websocket server,以及使用java.js生成websocket client进行通讯交互 1.java所需jar包 javax.websocket ja ...

  6. Spring消息之WebSocket

    一.WebSocket简介 WebSocket 的定义?WebSocket是HTML5下一种全双工通信协议.在建立连接后,WebSocket服务器端和客户端都能主动的向对方发送和接收数据,就像Sock ...

  7. js websocket同步等待_WebSocket硬核入门:200行代码,教你徒手撸一个WebSocket服务器...

    本文原题"Node.js - 200 多行代码实现 Websocket 协议",为了提升内容品质,有较大修订. 1.引言 最近正在研究 WebSocket 相关的知识,想着如何能自 ...

  8. swoole websocket服务

    websocket协议是基于TCP的一种新网络协议,它实现了浏览器与服务器全双工(full-duplex)通信--可以让服务器主动发送信息给客户端 为什么用websocket HTTP的通信只能由客户 ...

  9. 初识WebSocket

    众所周知,Http协议是无状态的,并且是基于Request/Response的方式与服务器进行交互,也就是我们常说的单工模式.但是随着互联 网的发展,浏览器与服务端进行双向通信需求的增加,长轮询向服务 ...

  10. c++ websocket客户端_你要的websocket都在这,收好不谢~~~

    此号已经沉寂多时,似乎已经忘了上一次更新是什么时候了!这一次重拾旧爱,希望能够一直保持下去,坚持写作,快乐你我他 今天的主题是websocket,相信搞研发的兄弟对websocket并不陌生,都202 ...

最新文章

  1. pythonexe32位-如何使用pyinstaller打包32位的exe程序
  2. 如何在dreamwaver中连接数据库
  3. PyTorch基础(11)----- torch.sum()方法
  4. (转)yi_meng linux 下 ifcfg-eth0 配置 以及ifconfig、ifup、ifdown区别
  5. linux shell之$?和得到联合使用命令的结果
  6. JPA - EntityTransaction与事务
  7. ngnix 作用(通俗易懂)【转载】
  8. 攻防世界web2(逆向加密算法)
  9. LeetCode之Z字形变换
  10. 解决keep-live使用之后的问题
  11. WBE漏洞-SQL注入之报错盲注
  12. 易点易动助力企业年中固定资产盘点
  13. PostgreSQL中文手册
  14. 菜鸟笔记——html整理
  15. php 语句以句号结尾,短句末尾是否用句号
  16. 偶数求和打分 c语言acm,杭州电子科技大学ACM2015-偶数求和-解题思路(accept)
  17. 瞎子摸象——shopnc篇
  18. 八皇后问题的进化(4)-python写的八皇后
  19. 2022全球新能源与智能汽车供应链创新大会|爱普搜同期项目对接会
  20. 历届蓝桥杯Scratch编程国赛 初级 中级 青少年编程比赛国赛真题解析【持续更新 已更新至27题】

热门文章

  1. (十)Hibernate的一对一关联关系
  2. 软件天才都是训练出来的
  3. redis运维问题集锦FAQ
  4. Teradata SQL tips
  5. Oracle下Latch详细介绍
  6. SQL 2008 群集配置详尽攻略[3]—主节点备节点数据库安装
  7. FMS3 客户端call服务器端
  8. IBM大力抢占网络宣传阵地,拿下百度“SOA”关键字的第一位
  9. Linux设备驱动模型-Ktype
  10. 绘制Linux/Android设备的内存动态变化趋势图