8小时用HTML5打造VNCViewer

2023-05-16

8小时用HTML5打造VNCViewer

http://cnborn.net/blog/

另一个话题是ThoughtWorks徐昊带来的《8小时用HTML5打造VNCViewer》。这个分享非常精彩,其实现过程中的思考方式、使用的新技术都让人有醍醐灌顶的感觉。以下的记录由现场的笔记总结而来,比较粗略,难免有失误,还望大家指正。
http://cnborn.net/blog/ 
由于HTML5具备Canvas, WebSocket,所以萌生了使用HTML5来打造一个VNCViewer的想法。同时为这个项目设定目标:在12小时之内完成。

HTML5的定义

在HTML5之前,HTML这个概念仅指代用以描述数据的语意化文档标签。之前的W3C始终将HTML定位为单纯定义数据的标准,有意淡化BOM(Browser Objective Model)对象。而从HTML5开始,第一次将HTML的概念扩展到HTML+CSS3+JS的集合。在原先的数据表现上添加了一些新的语意化标签如<header>, <footer>等,但BOM的增强更令人兴奋:引入Canvas, WebSQL, WebSocket(在频繁交互的网络应用中节约大量资源), PostMessage(在不同页面之间传递数据)等对象为实现更多种应用提供了可能。 

个人项目也要按照标准的项目流程做计划:进行任务分解。有任务分解列表的同时,也要有项目的风险列表。考虑到一些通常的项目风险,比如:一旦协议太复杂以致于不能用很短的时间了解,就会影响项目实现。

首先需要了解VNC协议,任务预计需要两小时。发现VNC的工作原理并不复杂:服务器和客户端经过握手确定协议版本、所支持的编码方式等,随后开始通信,传输屏幕上的显示内容。显示内容传输时支持不同编码方式,协议本身可以扩展以支持更多种编码方式。VNC的协议有43页(链接),1小时阅读完毕。其中主要包括两大部分,显示和接受输入。出于应用需要,不考虑输入部分的实现。

此时任务列表更新为:

  • 建立连接
  • 服务器与客户端间进行握手
  • 开始传送数据

使用HTML5的WebSocket建立连接时,发现WebSocket要求需要HTTP协议才能建立连接;同时建立长连接还需要如下步骤:HTML5端会发送一个请求,询问服务器是否能将协议升级成为WS/WSS协议,服务器需回复确认。但VNC服务器诞生较早,不支持升级协议这个约定。有两种解决方法:自己实现一个VNC Server,或者写一个Proxy来解决问题。因为自己实现VNC Server成本太高,不可能在时间限制内完成,所以选择了写Proxy的方案。
Proxy使用node.js , 一个运行在服务器端的JavaScript框架来完成。起初选用的原因主要还是个人的兴趣,接下来可以看到,最终这个框架拯救了整个项目。这个Proxy只用了10行JavaScript,使服务器和客户端的两个TCP流对接上即可。

服务器端代理部分耗时45分钟

接下来面临的是编码问题,VNC使用底层数据编码,而HTML端是相对高层的数据编码方式,这里通过node.js实现统一;服务器建立连接需要认证,VNC的认证机制使用DES加密。在网上寻找JavaScript DES库的时候,发现能找到的三个库均不能正常工作。不得已自己实现了JavaScript的DES库,耗费了不少时间。此时5个小时过去了,服务器端和客户端已经可以正确连接。

接下来解决显示的问题

Canvas有一个绘制函数几乎可以原生支持VNC的Raw编码方式,于是直接使用这个方法实现。测试时发现基本不能正常使用:由于数据传输量非常大,客户端的性能完全不能满足需求,画图速度太慢,占用资源过高。

6个小时过去了

考虑在信息传输方式上做优化,传递每个像素数据的Raw编码方式所需数据量过大。同时实验中发现不同VNC服务器发送信息的行为不太一样:苹果的服务器按照行的方式发送屏幕显示数据,而某个版本Linux中则是直接把屏幕分为四个区域来处理显示更新。按照区块刷新的编码方式进行了测试,发现并不能解决问题:画面后面的帧显示比原先略快但仍不可用,并且显示第一帧画面的速度非常慢。

解决传输数据量的问题,需要从传输协议上入手。VNC协议默认有5种Encode方式,分别是:

  • 全屏更新
  • 区域刷新
  • Hextile(将屏幕分成16x16的诸多小块来进行刷新,详解)
  • zlib 将raw的数据进行压缩然后再传输
  • hextile+zlib,将Hextile格式的数据进行压缩再传输

参考一些资料,均推荐使用zlib方式对数据进行压缩处理,可以节省带宽、提高速度(未经压缩的画面一帧的流量是4.3M)。此时需要一个JavaScript的zlib实现来进行解码工作。发现没有这样的库...... 此路不通。

能否使用HTML5的Worker进行后期处理?查阅文档发现Worker进程不能直接访问DOM对象,所以不能在Canvas上面进行绘画。而且传递大数据量时速度很慢。简单地说这个功能适用于计算密集的任务,但不适合这种数据密集的任务。

最后解决问题的关键功能,是一个比较陈旧、平时几乎不再使用的浏览器功能 - DataURI Encoding。即把资源经由Base64编码后直接显示在页面中。这里面最重要的突破在于:从最终目的中思考,用户最终的目的是什么?所需的VNC解码内容和哪些浏览器支持的原生信息格式最为接近?
首先想到的答案是视频,但是发现如果使用HTML5的<video>标签需要把VNC流转换为视频格式。这个工作太复杂,几乎无法完成。
如果不能作为视频来处理的话,那么作为图片显示的方式是否可行呢?把VNC的数据流转化为图片,浏览器即可通过硬件加速来显示图片。将VNC流转换成相应的图片格式在客户端进行太复杂,同时非常消耗资源。这时之前在服务器端选用的node.js技术发挥了重要作用。在VNC服务器端编写了一个新的VNC编码方式,可以直接将VNC的数据流以JPEG的方式进行编码(解决了传输数据量的问题),然后在服务器的node.js端对数据流进行解码,直接向浏览器传回通过Base64编码的JPEG图片,即可做到以很低的延迟显示VNC服务器的内容。

至此,整个项目完成,共耗时8小时23分钟

posted on 2012-05-16 23:17  lexus 阅读( ...) 评论( ...) 编辑 收藏

转载于:https://www.cnblogs.com/lexus/archive/2012/05/16/2505542.html

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

8小时用HTML5打造VNCViewer 的相关文章

随机推荐

  • stm32 利用DMA+串口空闲中断接受任意长数据

    因为想申请 CSDN 博客认证需要一定的粉丝量 xff0c 而我写了五年博客才 700 多粉丝 xff0c 本文开启关注才可阅读全文 xff0c 很抱歉影响您的阅读体验 目录 一 DMA1 简介2 使用场景3 主要特性4 DMA控制器结构5
  • 微星电脑安装win10+ubuntu16.04双系统遇到的各种坑

    最近尝试在微星电脑安装ubuntu 遇到各种问题 xff0c 在此记录一下 已有win10 xff0c 安装ubuntu16 04LTS版本微星ge73 Raider RGB 8RF显卡 xff1a GTX1070硬盘 xff1a 1T机械
  • 使用prim算法生成随机迷宫

    文章目录 一 关于随机迷宫生成二 prim算法1 最小生成树2 prim算法简介3 正确性证明 三 prim算法和迷宫生成1 迷宫生成和最小生成树的联系2 prim迷宫生成算法3 可以参考这些文章 一 关于随机迷宫生成 1 我们将迷宫定义如
  • TM4C123G学习记录(4)--关于ROM前缀函数和HWREG函数

    为了准备电赛临时学一下TM4C123G xff0c 简单记录学习内容大家可以在这里下载我收集的资源 xff0c 非常全面 xff0c 花了很大功夫收集来的 xff0c 还有书籍 例程代码等还可以在TI官网下载相关文档TI官网 这两天学习TM
  • TM4C123G学习记录(6)--UART

    因为想申请 CSDN 博客认证需要一定的粉丝量 xff0c 而我写了五年博客才 700 多粉丝 xff0c 本文开启关注才可阅读全文 xff0c 很抱歉影响您的阅读体验 为了准备电赛临时学一下TM4C123G xff0c 简单记录学习内容大
  • TM4C123G学习记录(7)--输入捕获

    因为想申请 CSDN 博客认证需要一定的粉丝量 xff0c 而我写了五年博客才 700 多粉丝 xff0c 本文开启关注才可阅读全文 xff0c 很抱歉影响您的阅读体验 为了准备电赛临时学一下TM4C123G xff0c 简单记录学习内容大
  • ANO匿名飞控分析(1)— 遥控器解码

    准备电赛 xff0c 简单写一下匿名飞控的分析基于TM4C主控的匿名拓空者飞控 xff0c 介绍见匿名科创 匿名拓空者PRO TI版全开源飞控使用入门 TM4C123 文章目录 一 简介二 PWM信号模式1 介绍2 硬件连接 三 PPM信号
  • OLAP分析引擎Druid配置文件详解(五):MiddleManager配置文件

    摘要 xff1a 本文是Druid配置文件系列博文的第五篇 xff0c 我们将继续逐个介绍Druid的五大组件 xff0c 本文将开始介绍Data Server中的middle manager和peon组件 以下配置都在middleMana
  • ANO匿名飞控分析(2)— 任务调度

    准备电赛 xff0c 简单写一下匿名飞控的分析基于TM4C主控的匿名拓空者飞控 xff0c 介绍见匿名科创 匿名拓空者PRO TI版全开源飞控使用入门 TM4C123 一 简介 匿名飞控的任务调度还是比较简单的 xff0c 没有操作系统什么
  • 点云地面点滤波(Cloth Simulation Filter, CSF)“布料”滤波算法介绍

    本篇博客参考Wuming Zhang的文章 An Easy to Use Airborne LiDAR Data Filtering Method Based on Cloth Simulation 不方便的小伙伴可以在此 xff1a 资源
  • TSCAN + TMODEL处理点云数据生成DEM

    点云数据生成DEM流程 目录 点云数据生成DEM流程1 软件环境2 操作流程2 1 加载TSCAN TMODEL插件2 2 读取点云数据2 3 点云去噪 滤波2 4 构建tin模型2 5 生成格网DEM2 6 查看DEM数据 对基于商业软件
  • LeGO-LOAM算法详解

    LeGO LOAM算法详解 整体框架 LeGO LOAM算法的总体框架如下图所示 xff1a 图中新增加了绿框中的Segmentation环节 xff0c 同时对后续的特征提取 Odometry以及Mapping部分均有一定的修改 xff0
  • 最速下降法解析(理解笔记)

    我们在高中或本科时期就了解到 xff1a 当函数存在解析形式且容易进行求导 xff08 f x f x f x 在最优点
  • ROS学习-tf介绍

    tf简介 一个机器人系统一个时间段通常有多个3D坐标系在变化 xff0c 如世界全局坐标系 xff0c world frame base frame gripper frame xff08 手臂 夹子坐标框架 xff09 xff0c hea
  • Anaconda 与 ROS 冲突解决

    Anaconda默认使用Python 3 而 ROS默认使用Python2 xff0c 若同时使用二者则会在调用一些ros包时出现冲突 目前解决方案是先在 bashrc文件中注释掉Anaconda xff1a span class toke
  • TI AWR1843毫米波雷达采集三维点云数据(ROS)

    毫米波雷达以其稳定性 对不同环境的适应能力 价格等方面的优势逐步引起了科研人员的注意 xff0c 本文主要介绍利用了TI xff08 德州仪器 xff09 的AWR1843设备 xff0c 基于ROS系统进行采集点云数据的流程 供大家参考及
  • 毫米波雷达原理介绍

    毫米波雷达是指工作在波长为1 10mm的毫米波段 xff0c 频率为30 xff5e 300GHz 基于其工作模式可以分为 脉冲 和 连续波 两种 其中 xff0c 脉冲类型的毫米波雷达的原理与激光雷达相似都是采用TOF的方法 而连续波类型
  • Ubuntu18.04使用Xorg创建虚拟屏幕

    目标 xff1a 使用远程软件 xff0c 如向日葵 TeamViewer Nomachine等来控制远程的电脑 xff08 Ubuntu 18 04桌面版本 xff09 作为服务端 存在问题 xff1a 被远程电脑若不连接屏幕会出现错误
  • 数学符号大全

    虽然在 Mathtype 能输入绝大多数想要的数学字符 xff0c 但是有些在 Visio 中无法输入 xff0c 可以在这里找出 xff0c copy就好了 xff0c 嘻嘻 xff5e 1 几何符号 2 代数符号 xff5e 3 运算符
  • 8小时用HTML5打造VNCViewer

    8小时用HTML5打造VNCViewer http cnborn net blog 另一个话题是ThoughtWorks徐昊带来的 8小时用HTML5打造VNCViewer 这个分享非常精彩 xff0c 其实现过程中的思考方式 使用的新技术