前言

参考的钉钉调试页面实现,仅供学习!

功能为:

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端

需要注意的是:

  • 服务端是引用的npmsocket.io

  • 客户端是引用socket.io-client项目中发布的socket.io.js文件

另外:

  • 后台程序直接基于es6语法编写的,然后基于gulp打包成dest文件,实际运行的是dest中的发布文件,代码规范接近与airbnb

  • 前端页面的话比较随意,样式还大量用了钉钉原本的样式,也没有考虑各种浏览器的兼容

  • 为什么说是hybrid调试页面?因为打造它的核心需求就是用来调试hybridAPI

步骤

由于篇幅关系(也没有必要),并不会将所有代码都介绍一遍,只会介绍一些重点步骤,更多的可以直接阅读源码(源码中已经足够清晰)

设计DebugRoom(PC端)和DebugClienthybrid端)

根据交互,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', ...)

一些逻辑上的细节

以上流程就是整套程序的基本思路与交互,这里再补充一些交互细节

  • 用全局的roomsHashclientsHash缓存住所有的房间和客户端,方便直接查询

  • 每次创建时,id可以直接绑定在对于的socket中,这样更方便

  • 房间和客户端id最好不要直接使用,可以进过一次编码(这样可以直接使用中文)

  • 客户端失联时,一定要先判断房间是否以及销毁,不要重复操作

  • 失去连接后,缓存中的引用要及时清除

更多源码请参考https://github.com/dailc/node-server-examples/tree/master/node-socketio-hybriddebug

附录

参考资料

基于socket.io打造hybrid调试页面的更多相关文章

  1. 使用socket.io打造公共聊天室

    最近的计算机网络课上老师开始讲socket,tcp相关的知识,当时脑袋里就蹦出一个想法,那就是打造一个聊天室.实现方式也挺多的,常见的可以用C++或者Java进行socket编程来构建这么一个聊天室. ...

  2. 基于socket.io的实时在线选座系统

    基于socket.io的实时在线选座系统(demo) 前言 前段时间公司做一个关于剧院的项目,遇到了这样一种情况. 在高并发多用户同时选座的情况下,假设A用户进入选座页面,正在选择座位,此时还没有提交 ...

  3. 在线白板,基于socket.io的多人在线协作工具

    首发:个人博客,更新&纠错&回复 是昨天这篇博文留的尾巴,socket.io库的使用练习,成品地址在这里. 代码已经上传到github,传送门.可以开俩浏览器看效果. 现实意义是俩人在 ...

  4. 基于 socket.io 的 AI 服务 杂谈

    为什么会想到来聊下这个话题. 前几天在公司的项目中,开发一个基于 socket.io 的直播 IM 功能. 直播分为两部分,一部分是比较昂贵的 视频推流, 另外一部分是 IM 即时聊天服务. 从这里开 ...

  5. 基于vue2.0打造移动商城页面实践 vue实现商城购物车功能 基于Vue、Vuex、Vue-router实现的购物商城(原生切换动画)效果

    基于vue2.0打造移动商城页面实践 地址:https://www.jianshu.com/p/2129bc4d40e9 vue实现商城购物车功能 地址:http://www.jb51.net/art ...

  6. 基于 socket.io, 简单实现多平台类似你猜我画 socket 数据传输

    一.前言 socket.io 实现了实时双向的基于事件的通讯机制,是基于 webSocket 的封装,但它不仅仅包括 webSocket,还对轮询(Polling)机制以及其它的实时通信方式封装成了通 ...

  7. 基于socket.io的实时消息推送

    用户访问Web站点的过程是基于HTTP协议的,而HTTP协议的工作模式是:请求-响应,客户端发出访问请求,服务器端以资源数据响应请求. 也就是说,服务器端始终是被动的,即使服务器端的资源数据发生变化, ...

  8. Node学习笔记(三):基于socket.io web版你画我猜(二)

    上一篇基础实现的功能是客户端canvas作图,导出dataURL从而实现图片信息推送,下面具体讲下服务端的配置及客户端的配置同步 首先先画一个流程图,讲下大概思路 <canvas id=&quo ...

  9. [Node.js] 基于Socket.IO 的私聊

    原文地址:http://www.moye.me/2015/01/02/node_socket-io/ 引子 最近听到这么一个问题:Socket.IO 怎么实现私聊?换个提法:怎么定位到人(端),或者说 ...

随机推荐

  1. 调试 ms 源代码

    如果需要调试 WPF 源代码或框架源代码,那么需要使用 DotPeek. 首先需要下载 dotPeek ,可以到官网下载 dotPeek: Free .NET Decompiler & Ass ...

  2. CMD(SA400 Command)

    一.CMD模糊查询: 命令行键入:CRT,WRK,ADD,CPY,DSP,CHG,CLR,FND,RTV*等. 二.CMD分类查询: 命令行键入:GO CMD xxx eg:GO CMD FILE,G ...

  3. [BC]Four Inages Strategy(三维空间判断正方形)

    题目连接 :http://bestcoder.hdu.edu.cn/contests/contest_showproblem.php?cid=577&pid=1001 题目大意:在三维空间中, ...

  4. Hadoop Streaming详解

    一: Hadoop Streaming详解 1.Streaming的作用 Hadoop Streaming框架,最大的好处是,让任何语言编写的map, reduce程序能够在hadoop集群上运行:m ...

  5. SVN.服务器迁移方法

    SVN项目, 源服务器  : 10.10.13.48 目标服务器: 10.10.13.129 要把SVN项目从.48上迁移到.129上. 做法: 准备: 版本库:vos 源服务器  : 10.10.1 ...

  6. LeetCode 153. Find Minimum in Rotated Sorted Array (在旋转有序数组中找到最小值)

    Suppose an array sorted in ascending order is rotated at some pivot unknown to you beforehand. (i.e. ...

  7. 浅析Entity Framework Core中的并发处理

    前言 Entity Framework Core 2.0更新也已经有一段时间了,园子里也有不少的文章.. 本文主要是浅析一下Entity Framework Core的并发处理方式. 1.常见的并发处 ...

  8. SQL基本查询_单表查询(实验二)

    SQL基本查询_单表查询(实验二) 查询目标表结构及数据 emp empno ename job hiedate sal comn deptno 1007 马明 内勤 1992-6-12 4000 2 ...

  9. .8-Vue源码之AST(4)

    上一节讲完了超长的start函数,也同时完结了handleStartTag函数,接着continue进入下一轮while循环. 此时剩余的字符串状态如图:,切掉了<div id='app'> ...

  10. hadoop2.6环境中部署hive1.2.2的错误

    1.hive配置遇到的问题( Relative path in absolute URI: ${system:java.io.tmpdir%7D/$%7Bsystem:user.name%7D) 解决 ...