基于socket.io打造hybrid调试页面
前言
参考的钉钉调试页面实现,仅供学习!
功能为:
PC端编写代码,手机端执行
解决的痛点是:
避免了调试hybrid应用时重复写各种测试页面
源码与示例
源码
https://github.com/dailc/node-server-examples/tree/master/node-socketio-hybriddebug
运行
1.`npm install`
2.`npm run serve`启动`node`服务
3.浏览器打开`./test/debugroom.html`页面
4.开始测试(浏览器直接打开或手机扫码)
注意,手机端链接请确保在同一个网段
注意⚠️,实际情况请重写client页面,让其支持对于Hybrid容器的API
示例


原理
原理其实非常简单,就是HTML5中的websocket,而且为了方便,还直接使用了成熟的第三方库socket.io
基本交互如下:
1.先启动一个node后台(控制台),基于`express`和`socket.io`监听`socket`连接
2.打开一个PC端调试页面,连接后台,创建一个房间(可以创建N个房间)
3.PC端页面基于房间号生成对应房间的客户端地址(每一个房间中可以有`N`个客户端),并基于地址创建二维码,方便使用(可以基于`qrcode.js`等库)
4.`Hybrid`客户端扫码后(或者打开客户端链接后),客户端页面连接后台,根据当前的房间号,在房间中创建客户端
5.PC端输入代码后,点击执行时,会将代码文本发送到后台,然后后台再推送给客户端,客户端通过`eval`即可执行这段代码,执行完毕后也可通过同样方式通知PC端
需要注意的是:
服务端是引用的
npm的socket.io包客户端是引用socket.io-client项目中发布的
socket.io.js文件
另外:
后台程序直接基于
es6语法编写的,然后基于gulp打包成dest文件,实际运行的是dest中的发布文件,代码规范接近与airbnb前端页面的话比较随意,样式还大量用了钉钉原本的样式,也没有考虑各种浏览器的兼容
为什么说是
hybrid调试页面?因为打造它的核心需求就是用来调试hybridAPI
步骤
由于篇幅关系(也没有必要),并不会将所有代码都介绍一遍,只会介绍一些重点步骤,更多的可以直接阅读源码(源码中已经足够清晰)
设计DebugRoom(PC端)和DebugClient(hybrid端)
根据交互,PC端和hybrid端都需要和后台连接,因此这里直接单独封装了两个类
DebuRoom类
房间的定义是:
只有一个
socket引用有一个房间
id标识房间内可以管理客户端(增,删,查)
class DebugRoom {
// 所属的房间号
this._roomId
// 所持有的socket对象
this._socket
// 客户端持有默认是一个空对象,key是clientid,value是client
this._clients
id()
clients()
socket()
getClientsCount()
removeClient(client)
addClient(client)
clearClients()
}
DebugClient类
客户端的定义是:
只有一个
socket引用有一个客户端
id标识有一个房间
id引用,指向对于的房间号(当然其实也可以是引用DebugRoom对象的)
class DebugClient {
// 所属的房间号
this._roomId
// 客户端id
this._clientId
// 所持有的socket对象
this._socket
id()
roomId()
socket()
}
设计一些交互接口
前后端交互通过socket.io中定义的事件来,以下是房间以及客户端和后台的交互事件接口
通用交互事件
后台:
// 后台监听连接,每有一个连接时(前端通过`io.connect`),会通知客户端触发'open'事件
io.on('connection', ...)
// 后台监听关闭连接,每当连接关闭时(前端直接关闭或调用`socket.disconnect`),会检测本地房间与客户端,如果关闭的是客户端,则移除这个客户端,对于的房间下的引用也置空,否则如果是房间,移除并关闭房间内所有的客户端
io.on('disconnect', ...)
房间与客户端:
// 前台监听打开事件,此时,如果是房间,则会通知后台触发'create room',否则通知后台触发'create client'
socket.on('open', ...)
// 前台监听连接是否关闭
socket.on('disconnect', ...)
房间与后台交互事件
后台:
// 监听创建房间,如果房间ID合法,则会创建一个新的房间(new DebugRoom)
io.on('create room', ...)
// 监听房间分发数据,并且将数据转发给房间内的所有客户端,通知客户端触发'receive dispatch data'事件
io.on('dispatch data', ...)
房间:
// 监听客户端创建,每一个客户端加入对应房间时都会通知这个房间
socket.on('client created', ...)
// 监听客户端关闭,每一个客户端退出时都会通知这个房间
socket.on('client destroy', ...)
// 监听客户端执行,客户端每执行一次分发数据时,都会通知房间是否执行成功
socket.on('client excuted', ...)
客户端与后台交互事件
后台:
// 监听客户端创建,如果房间已存在,并且客户端id合法,才会正常创建,创建完后会通知房间触发'client created'事件
io.on('create client', ...)
// 监听客户端响应执行,客户端执行一次分发数据后,会通知后台,后台接收到这个事件后,通知房间触发'client excuted'事件
io.on('client excute notify', ...)
客户端:
// 监听接收分发数据,接收完后会执行数据中的代码,并且通知后台是否执行成功,触发后台的'client excute notify'事件
socket.on('receive dispatch data', ...)
一些逻辑上的细节
以上流程就是整套程序的基本思路与交互,这里再补充一些交互细节
用全局的
roomsHash和clientsHash缓存住所有的房间和客户端,方便直接查询每次创建时,
id可以直接绑定在对于的socket中,这样更方便房间和客户端
id最好不要直接使用,可以进过一次编码(这样可以直接使用中文)客户端失联时,一定要先判断房间是否以及销毁,不要重复操作
失去连接后,缓存中的引用要及时清除
更多源码请参考https://github.com/dailc/node-server-examples/tree/master/node-socketio-hybriddebug
附录
参考资料
基于socket.io打造hybrid调试页面的更多相关文章
- 使用socket.io打造公共聊天室
最近的计算机网络课上老师开始讲socket,tcp相关的知识,当时脑袋里就蹦出一个想法,那就是打造一个聊天室.实现方式也挺多的,常见的可以用C++或者Java进行socket编程来构建这么一个聊天室. ...
- 基于socket.io的实时在线选座系统
基于socket.io的实时在线选座系统(demo) 前言 前段时间公司做一个关于剧院的项目,遇到了这样一种情况. 在高并发多用户同时选座的情况下,假设A用户进入选座页面,正在选择座位,此时还没有提交 ...
- 在线白板,基于socket.io的多人在线协作工具
首发:个人博客,更新&纠错&回复 是昨天这篇博文留的尾巴,socket.io库的使用练习,成品地址在这里. 代码已经上传到github,传送门.可以开俩浏览器看效果. 现实意义是俩人在 ...
- 基于 socket.io 的 AI 服务 杂谈
为什么会想到来聊下这个话题. 前几天在公司的项目中,开发一个基于 socket.io 的直播 IM 功能. 直播分为两部分,一部分是比较昂贵的 视频推流, 另外一部分是 IM 即时聊天服务. 从这里开 ...
- 基于vue2.0打造移动商城页面实践 vue实现商城购物车功能 基于Vue、Vuex、Vue-router实现的购物商城(原生切换动画)效果
基于vue2.0打造移动商城页面实践 地址:https://www.jianshu.com/p/2129bc4d40e9 vue实现商城购物车功能 地址:http://www.jb51.net/art ...
- 基于 socket.io, 简单实现多平台类似你猜我画 socket 数据传输
一.前言 socket.io 实现了实时双向的基于事件的通讯机制,是基于 webSocket 的封装,但它不仅仅包括 webSocket,还对轮询(Polling)机制以及其它的实时通信方式封装成了通 ...
- 基于socket.io的实时消息推送
用户访问Web站点的过程是基于HTTP协议的,而HTTP协议的工作模式是:请求-响应,客户端发出访问请求,服务器端以资源数据响应请求. 也就是说,服务器端始终是被动的,即使服务器端的资源数据发生变化, ...
- Node学习笔记(三):基于socket.io web版你画我猜(二)
上一篇基础实现的功能是客户端canvas作图,导出dataURL从而实现图片信息推送,下面具体讲下服务端的配置及客户端的配置同步 首先先画一个流程图,讲下大概思路 <canvas id=&quo ...
- [Node.js] 基于Socket.IO 的私聊
原文地址:http://www.moye.me/2015/01/02/node_socket-io/ 引子 最近听到这么一个问题:Socket.IO 怎么实现私聊?换个提法:怎么定位到人(端),或者说 ...
随机推荐
- OpenSCAD 建模:矿泉水瓶花洒
下载地址:https://github.com/ZhangGaoxing/openscad-models/tree/master/Sprinkle 代码: module screw(r=){ ::]) ...
- win10 uwp 截图 获取屏幕显示界面保存图片
本文主要讲如何保存我们的屏幕显示的,保存为图片,也就是截图,截我们应用显示的. UWP有一个功能,可以截图,RenderTargetBitmap 我们首先写一个Grid,我们需要给他名字,我这里给他S ...
- win10 uwp 随着数字变化颜色控件
我朋友在做一个控件,是显示异常,那么异常多就变为颜色,大概就是下面的图,很简单 首先是一个Ellipse,然后把他的颜色绑定到Int,需要一个转换,UWP的转换和WPF差不多,因为我现在还不会转换,就 ...
- 3des用法示例,已测试
using System;using System.Data;using System.Configuration;using System.Web;using System.Web.Security ...
- 66、django之模型层(model)--多表相关操作(图书管理小练习)
前面几篇随笔的数据库增删改查操作都是在单表的操作上的,然而现实中不可能都是单表操作,更多的是多表操作,一对一,一对多,多对多的表结构才是我们经常需要处理的,本篇将带我们了解多表操作的一些相关操作.也会 ...
- 原生js+css实现重力模拟弹跳系统的登录页面
今天小颖把之前保存的js特效视频看了一遍,跟着视频敲了敲嘻嘻,用原生js实现一个炫酷的登录页面.怎么个炫酷法呢,看看下面的图片大家就知道啦. 效果图: 不过在看代码之前呢,大家先和小颖看看css中的o ...
- swift 之设计模式 适配器
大学的时候,有一个<近世代数>的教授,他上课从来不看课本,并且也不按课本来讲解课程,但是他讲的东西比书本深刻形象(幽默,口才杠杠的),有层次感,除了授业,他还经常给我讲一些为人处世,做学问 ...
- YYHS-猜数字(并查集/线段树维护)
题目描述 LYK在玩猜数字游戏. 总共有n个互不相同的正整数,LYK每次猜一段区间的最小值.形如[li,ri]这段区间的数字的最小值一定等于xi. 我们总能构造出一种方案使得LY ...
- common lisp的宏的工作模式
(defmacro our-expander (name) ‘(get ,name ’expander))(defmacro our-defmacro (name parms &body bo ...
- Python 数据分析Windows环境搭建
1. 下载相应的Python软件并安装 python-3.6.0-amd64 2. 配置相应的环境变量path ;C:\Users\Administrator\AppData\Local\Progr ...