CopyLeft Trans By:晓风
The RFB Protocol
Tristan Richardson
RealVNC Ltd
(formerly of Olivetti Research Ltd / AT&T Labs Cambridge)
Version 3.8
Last updated 5 October 2006
RFB协议
翻译:晓风
英文版版权归RealVNC
中文版CopyLeft
E-mail:xfsuper@gmail.com
Blog: http://cuplinux.cublog.cn
2007.4.12
CopyLeft Trans By:晓风
目录
1 简介 3
2 显示协议 3
3 输入协议 3
4 像素数据的重现 4
5 协议扩展 4
6 协议消息 4
6.1握手消息 5
6.2安全类型 7
6.3初始化消息 7
6.4客户到服务器消息 9
6.5服务器到客户消息 13
6.6编码 15
6.7伪编码 20
CopyLeft Trans By:晓风
1 简介
RFB ("remote 帧缓存") 是一个远程图形用户的简单协议,因为它工作在帧缓存级别
上,所以它可以应用于所有的窗口系统,例如:X11,Windows 和 Mac 系统。其中 VNC
(Virtual Network Com p uting) 就采用 RFB.
远程终端用户使用机器(比如显示器、键盘/ 鼠标)的叫做 RFB客户端,提供帧缓存变
化的被称为 RFB服务器。
RFB 是真正意义上的“瘦客机”协议。RFB协议设计的重点在于减少对客户端的硬件
需求。这样客户端就可以运行在许多不同的硬件上,客户机的任务实现上就会尽量的简单。
RFB协议对于客户端是无状态的。也就是说:如果客户端从服务器端断开,那么如果它
重新连接相同的服务器,客户端的状态会被保存。甚至,一个不同的客户端可以用来连接相
同的 RFB服务器。而在新的客户端已经能够获得与前一个客户端相同的用户状态。因此,用
户的应用接口变的非常便捷。
只要合适的网络连接存在,那么用户就可以使用自己的应用程序,并且这些应用会一
直保存,即使在不同的接入点也不会变化。这样无论在哪,系统都会给用户提供一个熟悉、
独特的计算环境。
2 显示协议
显示协议是建立在“把像素数据放在一个由 x,y 定位的方框内”这单一图形基础之上
的。乍一看上去,把这么多的用户接口组件绘制出来是非常低效的方法。但是,允许不同的
像素数据编码方式,使得我们在处理不同的参数(如:网络带宽,客户端的绘制速度,服
务器处理速度)有了很大程度的灵活性。
通过矩形的序列来完成帧缓存的更新。一次更新代
表
关于同志近三年现实表现材料材料类招标技术评分表图表与交易pdf视力表打印pdf用图表说话 pdf
着从一个可用帧缓存状态转换到另
一个可用,因此有点和视频的桢类似。尽管矩形的更新一般是分开的,但是并不是必须的。
显示协议的更新部分是由客户端通过命令驱动的。也就是说,更新只是在服务器端响应
客户端的请求时发生的。这样就让协议更新质量是可变的。客户端/ 网络越慢,更新速度也就
越慢。对于一些应用来说,相同区域的更新是连续不断的。如果用一个慢的客户端,那么帧
缓存的缓存状态是可以被忽略的。这样也可以减少对客户端网络速度和绘制速度的要求。
3 输入协议
输入协议是基于
标准
excel标准偏差excel标准偏差函数exl标准差函数国标检验抽样标准表免费下载红头文件格式标准下载
工作站的键盘和鼠标等设备的连接协议。输入事件就是通过把客户
端的输入发送到服务器端。这些输入事件也可以通过非标准的 I /O 设备来综合。例如,手写
笔引擎可能产生一个键盘事件。
CopyLeft Trans By:晓风
4 像素数据的重现
初始的交互涉及到 RFB客户端和服务器之间传输像素数据格式和编码方式的协调。
这种协调被设计的让客户端的工作尽量简单。而设计的底线是:服务器必须按照客户端的要
求格式来提供像素数据。如果客户端可以同样的处理多种数据格式或编码格式,那么一般会
选择服务器端易于生成的格式。
像素格式涉及如何通过像素值来实现不同颜色的重现。最常用的一般像素格式是 24 位
或 16 位的“真彩色”,它通过位来直接实现像素值到红、绿、蓝亮度的转换。8 位“颜色映
射”可以任意映射像素值到 RGB亮度的转换。
编码解决像素数据如何通过网络传输的问
题
快递公司问题件快递公司问题件货款处理关于圆的周长面积重点题型关于解方程组的题及答案关于南海问题
。每一个矩形像素数据都带有数据的 X,Y参
数,宽和高是举行,编码类型确定像素数据的编码方式。数据本身遵循特定的编码。
目前的编码方式主要有 Raw、CopyRect、RRE、Hextile 和 ZRLE.在实际应用中我们一
般使用 ZRLE、Hextile 和 CopyRect,因为它们提供了典型桌面的最好压缩。(参照 6.6 关于
每种编码方式的描述)
5 协议扩展
协议可以通过以下方式进行扩展:
新的编码方式
一种新的协议可以通过与现存的客户端和服务端进行相关兼容的添加。因为现存的服务
器将会忽略它们所不支持的新编码方式。所以客户端通过新的编码方式进行请求也就不会有
结果返回。
伪编码方式
除了真正的编码方式,客户端也可以请求“伪编码”通告服务器,它支持某一协议的
扩展。服务器如果不支持这种扩展,那么它将忽略。值得注意的是:客户端必须先假设服务
器端不支持这种扩展,直到它获得服务器端支持的确认。(参照 6.7 伪编码的描述)
新的安全方式
添加一个新型的安全方式会带来无限的灵活性,它通过修改协议的一些行为,但是并
没有牺牲现存客户端和服务器端的兼容性。客户端和服务器端可以通过协议好的安全方式进
行交流,当然并不一定与 RFB协议类似。
无论如何你都不应使用不同的版本号
RFB协议的版本是由 RealVNC公司来制定的。如果你使用一个不同的协议版本可能与
RFB/VNC兼容,要保证协议的兼容性,请联系 RealVNC公司。这样会减少在编码方式和
安全类型上的冲突。请登陆 h t t p: / / www.realvnc.com 查看我们的联系方式,加入 VNC邮
件列表也是一个很好的选择。
6 协议消息
RFB协议可以进行可靠的传输,如字节流或基于消息的。和大多数协议一样,它也是通
过 TCP /IP 协议簇连接。协议由三步完成连接。首先是握手报文,目的是对协议版本和加密
方式进行协商。第二步是初始化报文,主要用于客户和服务器的初始化消息。最后就是正常
协议的交互,客户端可以按需发送消息,然后可以获得服务器的回复。所有的消息以消息类
型开始,接下来是特定的消息数据。
CopyLeft Trans By:晓风
协议消息描述的基本类型有:U8、U16、U32、S8、S16、S32。U 表示无符号整数,S表示
有符号整数。所有字节整数(除了像素值本身)遵从 Endian 顺序。
PIXEL代表一个像素值 bytesPerPixel字节,8XbytesPerPixel = bits - per - pixel,这
个等式在客户端/ 服务器、ServerInit消息(参照 6.3.2节)、SetPixelFormat 消息(参照
6.4.1节)中是被承认的。
6.1 握手消息
6.1.1 协议版本
握手始于服务器向客户发送协议版本的消息,以告知客户服务器所能支持RFB协议的
最高版本号。此时客户端会发送相似的消息告诉服务器将要使用的协议版本。客户端不应该
请求高于服务器的协议版本。如此一来就给客户和服务器端提供了一种向后兼容机制。
目前发布的协议版本主要有 3.3、3.7、3.8(3.5版本被
报告
软件系统测试报告下载sgs报告如何下载关于路面塌陷情况报告535n,sgs报告怎么下载竣工报告下载
存在问题),对于新的编码
和伪码方式版本号不需要进行修改,因为服务器端可能忽略它不能识别的版本。
协议版本消息由 12 字节的 ASCII 码串组成,它的格式"RFB xxx.yyy \ n",其中 xxx 和
yyy 分别是主要和次的版本号,并用 0 进行补充。
6.1.2 安全
一旦协议版本被确定,服务器和客户端必须一致同意连接的安全类型。
V3.7 向上 服务器支持的安全类型:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
字节数 | 类型 [ 值 ] | 描述
- - - - - - - - - - - - - + - - - - - - - - - - - - - - - + - - - - - - - - - - - - - -
1 | U8 | 安全类型号
- - - - - - - - - - - - - + - - - - - - - - - - - - - - - + - - - - - - - - - - - - - -
安全类型号 | U8 数组 | 安全类型
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
如果客户端能支持服务器的某一安全类型,那么客户端就会发送一个字节来确认连接
的安全类型:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
字节数 | 类型 [ 值 ] | 描述
- - - - - - - - - - - - - + - - - - - - - - - - - - + - - - - - - - - - - - - - - - - -
1 | U8 | 安全类型
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
如果安全类型号是 0,那么连接失败(例如服务器不支持客户请求版本号),这样就
会有字符串来描述失败原因:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
字节数 | 类型 [ 值 ] | 描述
- - - - - - - - - - - - - + - - - - - - - - - - - - - - - - - + - - - - - - - - - - - -
4 | U32 | 原因长度
- - - - - - - - - - - - - + - - - - - - - - - - - - - - - - - + - - - - - - - - - - - -
原因长度 | U8 数组 | 原因字串
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
服务器在发送原因字串后就会关闭连接。
CopyLeft Trans By:晓风
V3.3 服务器决定安全类型并发送一个字:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
字节数 | 类型 [ 值 ] | 描述
- - - - - - - - - - - - - + - - - - - - - - - - - - - - - - - + - - - - - - - - - - - -
4 | U32 | 安全类型
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
安全类型的值一般有 0、1、2。0 表示连接失败,并伴随原因字串。
本文中定义的安全类型有:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
号码 | 名称
- - - - - - - - - - + - - - - - - - - - - - - - - - - - - -
0 | 不可用
- - - - - - - - - - + - - - - - - - - - - - - - - - - - - -
1 | NONE
- - - - - - - - - - + - - - - - - - - - - - - - - - - - - -
2 | VNC 认证
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
其他已注册的安全类型主要包括:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
号码 | 名称
- - - - - - - - + - - - - - - - - - - - - - - - - - - - - - -
5 | RA2
6 | RA2ne
16 | Tight
17 | Ultra
18 | TLS
19 | VeNCrypt
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
安全类型确定,数据遵循安全类型的定义(详情参见 6.2)。安全握手报文的末端,一
般伴随着安全结果消息。
注意:在安全握手报文之后,很有可能是其他协议数据经过加密或者被修改的通道。
6.1.3 安全结果
服务器发送一个字告诉客户端安全握手成功。
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
字节号 | 类型 [ 值 ] | 描述
- - - - - - - - + - - - - - - - - - - - + - - - - - - - - -
4 | U32 | 状态:
- - - - - - - - + - - - - - - - - - - - + - - - - - - - - -
| 0 | 成功
- - - - - - - - + - - - - - - - - - - - + - - - - - - - - -
| 1 | 失败
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
CopyLeft Trans By:晓风
如果成功,协议进入初始报文 (第 6.3节)
V3.8 以上版本 如果不成功,就会有字符串来描述失败原因,并关闭连接:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
字节数 | 类型 [ 值 ] | 描述
- - - - - - - - + - - - - - - - - - - - + - - - - - - - - -
4 | U32 | 原因长度
- - - - - - - - + - - - - - - - - - - - + - - - - - - - - -
原因长度 | U8 数组 | 原因字串
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
对于 V3.3 和 3.7 如果不成功,服务器直接关闭连接。
6.2 安全类型
6.2.1 NONE
不需要认证,协议数据将被使用明文发送。
V3.8 以上版本, 还会带有安全结果的消息。
V3.3 和 3.7 协议直接进入初始报文(参照 6.3).
6.2.2 VNC认证
采用 VNC认证,协议数据将采用明文发送,服务器发送一个 16 字节的随机数验证:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
字节数 | 类型 [ 值 ] | 描述
- - - - - - - - + - - - - - - - - - - - + - - - - - - - - -
16 | U8 | 验证
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
客户端使用 DES 对验证进行加密,使用用户密码作为密钥,把 16 字节的回复返回到
服务器:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
字节数 | 类型 [ 值 ] | 描述
- - - - - - - - + - - - - - - - - - - - + - - - - - - - - -
16 | U8 | 验证
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
随之而来的就是安全结果消息。
6.3 初始化消息
一旦客户和服务器都同意使用同一安全类型进行交流,那么协议进入初始化消息。
客户端发送一个客户初始化消息,紧接着就是服务器初始化消息。
6.3.1 客户端初始化
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
字节数 | 类型 [ 值 ] | 描述
- - - - - - - - + - - - - - - - - - - - + - - - - - - - - -
1 | U8 | 共享标志
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
如果服务器同意其他客户继续连接,那么共享标志应该是非零(真)。否则,服务器将
断开其他客户的连接。
6.3.2 服务器初始化
CopyLeft Trans By:晓风
服务器收到客户端初始化的消息后,会发送一个服务器初始化消息。主要是告知客户端
服务器上帧缓存的高宽,像素格式还有与桌面相关的名称。
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
字节数 | 类型 [ 值 ] | 描述
- - - - - - - - + - - - - - - - - - - - + - - - - - - - - - - - - - - - - - -
2 | U16 | 帧缓存宽度
- - - - - - - - + - - - - - - - - - - - + - - - - - - - - - - - - - - - - - -
2 | U16 | 帧缓存高度
- - - - - - - - + - - - - - - - - - - - + - - - - - - - - - - - - - - - - - -
16 | 像素格式 | 服务器像素格式
- - - - - - - - + - - - - - - - - - - - + - - - - - - - - - - - - - - - - - -
4 | U32 | 名字长度
- - - - - - - - + - - - - - - - - - - - + - - - - - - - - - - - - - - - - - -
名字长度 | U8 数组 | 名字字串
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
像素格式主要包括以下段:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
字节数 | 类型 [ 值 ] | 描述
- - - - - - - - + - - - - - - - - - - - + - - - - - - - - - - - - - - - - - -
1 | U8 | 位/ 像素
- - - - - - - - + - - - - - - - - - - - + - - - - - - - - - - - - - - - - - -
1 | U8 | 深度
- - - - - - - - + - - - - - - - - - - - + - - - - - - - - - - - - - - - - - -
1 | U8 | big - en dian 标志
- - - - - - - - + - - - - - - - - - - - + - - - - - - - - - - - - - - - - - -
1 | U8 | 真彩标志
- - - - - - - - + - - - - - - - - - - - + - - - - - - - - - - - - - - - - - -
2 | U16 | 红色最大值
- - - - - - - - + - - - - - - - - - - - + - - - - - - - - - - - - - - - - - -
2 | U16 | 绿色最大值
- - - - - - - - + - - - - - - - - - - - + - - - - - - - - - - - - - - - - - -
2 | U16 | 蓝色最大值
- - - - - - - - + - - - - - - - - - - - + - - - - - - - - - - - - - - - - - -
1 | U8 | 红色-替换
- - - - - - - - + - - - - - - - - - - - + - - - - - - - - - - - - - - - - - -
1 | U8 | 绿色-替换
- - - - - - - - + - - - - - - - - - - - + - - - - - - - - - - - - - - - - - -
1 | U8 | 蓝色-替换
- - - - - - - - + - - - - - - - - - - - + - - - - - - - - - - - - - - - - - -
3 | | 补充
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
服务器象素定义服务器本来的象素格式,这种象素格式会被一直使用,除非客户端使
CopyLeft Trans By:晓风
用设置象素格式消息来请求另一种象素格式。(参照 6.4.1)
位每象素表示每一个象素值对应的位数,它必须大于等于每个象素值。目前位每象素必
须是 8,16或 32——小于 8 位象素不被支持。如果多字节象素被看做 big en dian,那么 Big -
en dian 标志非零。当然了,这对 8 位每象素没有任何意义。
如果真彩标志非零,那么最后 6 项
规定
关于下班后关闭电源的规定党章中关于入党时间的规定公务员考核规定下载规定办法文件下载宁波关于闷顶的规定
如何按照象素值来确定红、绿、蓝的亮度。红的最
大值是红色的最大值(=2 ^n - 1, n 表示用在红色上的位数)。注意这个值一般在 big endian
的顺序中。红色-替换表示要得到最低明显 bit 所需要的替换个数。绿色最大值、绿色-替换和
蓝色最大值、蓝色-替换和红色类似。要在 0—红色最大值之间找一个红色值,按照以下步骤
进行:
• 遵循 big - en dian 标志进行象素值。(例如:如果 big - endian 标志为 0,主机的字
节顺序是 big endian,然后交换)。
• 使用红色—替换将右边替换。
• 和红色最大值进行逻辑与(按照主机字节顺序)。
如果真彩标志是零,那么服务器使用的象素值不是直接由红、绿、蓝的亮度组成,但是
服务为索引到颜色图中去。颜色图中的项目是由服务器使用“设置颜色面板条目”消息进行
设置的。
6.4 客户到服务器消息
客户到服务器的消息在本文中有如下定义:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
号码 | 名称
- - - - - - - - - - + - - - - - - - - - - - - - - - - - - - - -
0 | 设置象素格式
- - - - - - - - - - + - - - - - - - - - - - - - - - - - - - - -
2 | 设置编码
- - - - - - - - - - + - - - - - - - - - - - - - - - - - - - - -
3 | 帧缓存更新请求
- - - - - - - - - - + - - - - - - - - - - - - - - - - - - - - -
4 | 按键事件
- - - - - - - - - - + - - - - - - - - - - - - - - - - - - - - -
5 | 鼠标事件
- - - - - - - - - - + - - - - - - - - - - - - - - - - - - - - -
6 | 客户剪切文本
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
其余的注册消息类型有:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
号码 | 名称
- - - - - - - - - - + - - - - - - - - - - - - - - - - - - - -
255 | Anthony Liguori
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
值得注意的是:如果要发送未在本文中定义的消息,那么必须得到服务器端的消息确
认。
6.4.1设置象素格式
CopyLeft Trans By:晓风
“帧缓存更新”消息中设置什么格式的象素值如何设置。
如果客户端没有发送“设置象素格式”消息,那么服务器发送的象素值将遵循在服务器初
始化消息中所包括的象素格式(参照 6.3.2)。
如果真彩标志是零,那么意味着使用“颜色面板”,只要客户端发送颜色面板空的消
息,或者是面板项被服务器端重设,服务器可以使用设置颜色面板项目进行颜色面板的设
置(参照 6.5.2)。
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
字节数 | 类型 [ 值 ] | 描述
- - - - - - - - + - - - - - - - - - - - + - - - - - - - - - - - - - - - - - -
1 | U8 0 | 消息类型
- - - - - - - - + - - - - - - - - - - - + - - - - - - - - - - - - - - - - - -
3 | | 填充
- - - - - - - - + - - - - - - - - - - - + - - - - - - - - - - - - - - - - - -
16 | 象素格式 | 象素格式
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
注:其中的象素格式如在 6.3.2 中的描述
6.4.2设置编码方式
设置编码方式可以来确定服务器发送象素数据的类型。消息中编码方式的顺序是客户端
按照优先级来排列(第一个拥有最高的优先级)。服务器可能选择这种顺序,也可能不选择。
象素数据也可以使用“原始编码”如果没有具体说明。
除了基本的编码方式,客户端也可以请求“伪编码”通告服务器它支持某一种扩展协
议。如果服务器不支持这种扩展,它就会忽略这种伪编码。注意:这意味着客户端在得到服
务器的确认之前都要假设服务器并不支持它的扩展。
参照 6.6(每种编码方式的描述) 6.7(伪编码的含义)。
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
字节数 | 类型 [ 值 ] | 描述
- - - - - - - - - - + - - - - - - - - - - - - - - - - + - - - - - - - - - - -
1 | U8 2 | 消息类型
- - - - - - - - - - + - - - - - - - - - - - - - - - - + - - - - - - - - - - -
1 | | 填充
- - - - - - - - - - + - - - - - - - - - - - - - - - - + - - - - - - - - - - -
2 | U16 | 编码编号
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
接下来就是编码编号的重复
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
字节数 | 类型 [ 值 ] | 描述
- - - - - - - - - - + - - - - - - - - - - - - - - - - + - - - - - - - - - - -
4 | S32 | 编码类型
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
6.4.3 帧缓存更新请求
客户端只在乎帧缓存区域的 x、y、宽度和高度。服务器一般通过发送帧缓存更新来响应
更新请求。当然,有可能一个帧缓存更新可能是多个请求的响应结果。
CopyLeft Trans By:晓风
通常服务器假设客户端有所有它所感兴趣的帧缓存,因此服务器只需要进行增量更新
就 OK 了。
但是如果因为某种原因,客户端丢失某一部分必须的内容,那么它发送帧缓存更新请
求的时候就会将增量设置为零。这样就会请求服务器尽快把所需内容进行发送。而这块不会
使用 CopyRect 编码方式进行更新。
反之,客户端就会增量设置为非零。如果只是在特定区域发生改变,那么服务器就会发
送帧缓存更新。注意:在请求和更新之间可能存在不确定时间段。
在客户端比较快的情况下,客户端有可能会规定增量请求的速率,这样可以避免无端
占用网络。
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
字节数 | 类型 [ 值 ] | 描述
- - - - - - - - - - + - - - - - - - - - - - - - - - - + - - - - - - - - - - -
1 | U8 3 | 消息类型
- - - - - - - - - - + - - - - - - - - - - - - - - - - + - - - - - - - - - - -
1 | U8 | 增量标志
- - - - - - - - - - + - - - - - - - - - - - - - - - - + - - - - - - - - - - -
2 | U16 | x坐标
- - - - - - - - - - + - - - - - - - - - - - - - - - - + - - - - - - - - - - -
2 | U16 | y坐标
- - - - - - - - - - + - - - - - - - - - - - - - - - - + - - - - - - - - - - -
2 | U16 | 宽度
- - - - - - - - - - + - - - - - - - - - - - - - - - - + - - - - - - - - - - -
2 | U16 | 高度
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
6.4.4 按键事件
某一个键的按下与释放。如果某一个键被按下,那么按下标志非零。释放的时候变为零。
在 X Window 系统中键本身被赋值为“keysym”。
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
字节数 | 类型 [ 值 ] | 描述
- - - - - - - - - - + - - - - - - - - - - - - - - - - + - - - - - - - - - - -
1 | U8 4 | 消息类型
- - - - - - - - - - + - - - - - - - - - - - - - - - - + - - - - - - - - - - -
1 | U8 | 按下标志
- - - - - - - - - - + - - - - - - - - - - - - - - - - + - - - - - - - - - - -
2 | | 补充
- - - - - - - - - - + - - - - - - - - - - - - - - - - + - - - - - - - - - - -
4 | U32 | 键号
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
对于大多数键来说,“keysym”与 ASCII 码相对应,具体参考《The Xlib Reference
Manual》或者参考
。部分按键对应如下:
CopyLeft Trans By:晓风
解释 keysyms 是一个非常复杂的过程,为了能够尽量广泛的使用,我们应该遵守以
下指导意见:
• “切换状态”(例如:切换是否按下)必须只能用于解释 keysym。例如,在美式键
盘上,“#”是需要按下 Shift,而英式键盘就不需要。对于一个使用美式键盘的服
务器就不会返回“#”来自于英式键盘的请求,因为它没有使用“Shift”,这样的
话,看起来服务器应该“洗掉”s hif t 为了获得“#”。
• 大小写的差别对于 keysyms 非常明显的。而在处理中不应该将它们同等对待。比如:
“A”服务器应该不用按下 Shift 就将它解释为“A”。这又涉及到“洗掉”Shift按键
的问题。
• 服务器应该尽可能忽略“lock”,例如 CapsLock 和 Nu mLock。取而代之的是根据
字符来判断它的大小写。
• 和 s hif t 不同,修改状态的按键,比如 Ctrl 和 Alt 应该看做修改其他的 keysyms。
我们注意到在 ASCII 中没有像 “Ctrl - a”类似的控制码,所以应该通过客户端来发
送。
• 对于客户端,Ctrl 和 Alt 也应该基于子房来判断,因为客户端可能“释放”来让
keysyms 来正确的解释。例如,在德国的个人计算机键盘中,ctrl +alt + q 产生@字
符,这样的话,我们必须让客户端正确的输入。
• 在 X window 系统中没有统一的“Backward”按键,在某些系统中,s hif t + t ab
产生“ISO_Left_Tab”,而在其他可能提供一个“BackTab”,也有“Tab” 和应用
来告诉服务器 s hif t 的状态表示 backward - tab 而不是 forward - tab。在 RFB协议
中更接近后者的实现方式。客户端应该产生一个切换 Tab 而不是“ISO_Left_Tab”.
尽管如此,为了与目前客户端向后兼容,服务器应该把 ISO_Left_Tab 看做为变换
的 Tab 键。
6.4.5 鼠标(指针)事件
检测指针移动或者某一个键的按下或释放。指针目前在(x坐标、y 坐标),按钮的 1 到
8 状态通过 0 到 7 位来表示,0 表示松开,1 表示按下。
拿普通鼠标来说,1,2,3 分别响应左、中、右键。对于滑轮鼠标来说,滚轮向上表示 4
键的按下和释放,而向下表示 5 键的按下和释放。
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
字节数 | 类型 [ 值 ] | 描述
- - - - - - - - - - + - - - - - - - - - - - - - - - - + - - - - - - - - - - -
1 | U8 5 | 消息类型
- - - - - - - - - - + - - - - - - - - - - - - - - - - + - - - - - - - - - - -
1 | U8 | 按键屏蔽
- - - - - - - - - - + - - - - - - - - - - - - - - - - + - - - - - - - - - - -
2 | U16 | x坐标
- - - - - - - - - - + - - - - - - - - - - - - - - - - + - - - - - - - - - - -
2 | U16 | y 坐标
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
6.4.6 客户端文本剪切
客户端有新的 ISO8859 - 1(Latin - 1) 文本在它的剪切缓存里,行
CopyLeft Trans By:晓风
的末尾通过新行字符(值为 10)来表示。 需要无回车(值为 13)。目前还没有找到传输非
Latin - 1 字符集的方法。
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
字节数 | 类型 [ 值 ] | 描述
- - - - - - - - - - + - - - - - - - - - - - - - - - - + - - - - - - - - - - -
1 | U8 6 | 消息类型
- - - - - - - - - - + - - - - - - - - - - - - - - - - + - - - - - - - - - - -
3 | | 填充
- - - - - - - - - - + - - - - - - - - - - - - - - - - + - - - - - - - - - - -
4 | U32 | 长度
- - - - - - - - - - + - - - - - - - - - - - - - - - - + - - - - - - - - - - -
长度 | U8 数组 | 文本
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
6.5 服务器到客户消息
服务器到客户消息在本文中定义如下:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
号码 | 名称
- - - - - - - - - - + - - - - - - - - - - - - - - - - - - - - -
0 | 帧缓存更新
1 | 设置颜色面板条目
2 | 响铃
3 | 服务器剪切文本
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
其余注册的消息类型:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
号码 | 名称
- - - - - - - - - - + - - - - - - - - - - - - - - - - - - - - -
255 | Anthony Liguorui
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
注意在服务器发送消息之前必须确认客户端支持相关扩展,通常在请求“伪编码”的
时候使用。
6.5.1 帧缓存更新
帧缓存更新是由一系列像素数据矩形而组成,这些矩形会被客户端送入它的帧缓存中。
它是对客户端帧缓存更新请求的响应。而在请求和响应之间有可能存在不确定时期。
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
字节数 | 类型 [ 值 ] | 描述
- - - - - - - - - - + - - - - - - - - - - - - - - - - + - - - - - - - - - - -
1 | U8 0 | 消息类型
- - - - - - - - - - + - - - - - - - - - - - - - - - - + - - - - - - - - - - -
1 | | 填充
- - - - - - - - - - + - - - - - - - - - - - - - - - - + - - - - - - - - - - -
2 | U16 | 矩形编号
CopyLeft Trans By:晓风
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
随着像素数据矩形的个数,每个矩形包括以下内容:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
字节数 | 类型 [ 值 ] | 描述
- - - - - - - - - - + - - - - - - - - - - - - - - - - + - - - - - - - - - - -
2 | U16 | x坐标
- - - - - - - - - - + - - - - - - - - - - - - - - - - + - - - - - - - - - - -
2 | U16 | y 坐标
- - - - - - - - - - + - - - - - - - - - - - - - - - - + - - - - - - - - - - -
2 | U16 | 宽度
- - - - - - - - - - + - - - - - - - - - - - - - - - - + - - - - - - - - - - -
2 | U16 | 高度
- - - - - - - - - - + - - - - - - - - - - - - - - - - + - - - - - - - - - - -
4 | S32 | 编码类型
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
对应像素数据也是由特定的编码方式,参照 6.6(编码的数据格式)参照 6.7(伪编码
的含义)
6.5.2 设置颜色面板条目
当像素格式使用“颜色面板”时,消息告诉客户端对应像素值如何映射为 RGB亮度。
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
字节数 | 类型 [ 值 ] | 描述
- - - - - - - - - - + - - - - - - - - - - - - - - - - + - - - - - - - - - - -
1 | U8 1 | 消息类型
- - - - - - - - - - + - - - - - - - - - - - - - - - - + - - - - - - - -