级别: 初级 Cameron Laird (claird@phaseit.net), 副总裁, Phaseit,Inc.
2003 年 3 月 01 日 尽管 VNC(Virtual Network Computing,虚拟网络计算) 技术已广泛用作程序员和管理员的“生产力工具”,但该技术的功能远远超过这些。tclRFB 为分布式体系结构提供了可能。
对于用作“生产力工具”的虚拟网络计算(VNC)技术,您可能早有耳闻,甚至您自己
就在使用它。但是,您听说过如何将 VNC 用作开发构件吗?恐怕还没有吧!不过没关系,有关这方面激动人心的讲解就要开始了!
应用上的卓越表现
首先,让我们来回顾一下 VNC 技术,
developerWorks
网站以前已对该技术进行过多次探讨。大部分读者已熟悉 VNC 的基本运行情况:将 VNC 服务器安装在一台中心机器上,然后远程的 VNC
客户端就可以在宿主机上远程查看中心机器上的图形显示。这听起来有些类似于 X11 视窗系统,只是改变了一些标志。与 X 的相同之处在于,VNC 也可以对通信流进行加密、隧道、
封装等处理。此外,VNC 还有助于采用“计算服务器”,这样的计算服务器可以集中地维护,而不管用户在哪里都可以看到图形结果。
然而,VNC 与 X
的不同之处在于:它是“多路复用的”,也就是说无论是没有客户桌面观看的情况还是有多个客户在同时观看,都不会影响图形应用程序的继续运行。同时,VNC
还具有极佳的可移植性;此外,对于各种硬件和操作系统(包括大型机、电话手持机和非常大量的老式机器)都可以免费得到良好的实现。
这些特性使得 VNC
成了许多开发难题的解决方案。假设您有一个运行在 Linux 机器上的图形应用程序,现在要您将它移植到 Windows 桌面,或者将它转换成一个 Web
应用程序。一个几乎不加思索就得出的答案是,将应用程序显示的图形反馈给一个 Linux 主机上的 VNC 服务器,然后凭借 Windows 或 Web 上的 VNC
客户端来远程地查看应用程序。这样一来,原本从源代码级进行移植需要耗费几周时间的工作,现在仅用一个下午就可以完成。
可编程性的突破进展
当然,如果 VNC 也具有
可编程性的话,那就再好不过了。从某种程度上讲,其他诸如 X
这样的远程控制技术实际上也不具备真正的可编程性。到目前为止,我们已经知道用户能够利用 VNC
来分割计算并通过不同的机器来显示,并且开发者能够使用同一技术将图形结果显示给终端用户。现在我们来进行更加细致的探讨。
除了让终端用户使用身经百战的、免费的、与操作系统无关的 VNC 查看器之外,您也可以编写您自己的查看器。例如,您可以使一个 VNC
显示只是大型应用程序中的一帧。或者,您可以调整 VNC
显示的调色板和透明度,并用图形的局部来覆盖其他部分。或者,您可以给显示赋予“生机”,使信息流反向,以及应用光标响应——鼠标点击、拖动,等等——以允许终端用户更好地控制他所看到的东西。您可以继续依赖成熟的 VNC
服务器,也许在您将自己自定义的 VNC 查看器装扮成客户所需的东西时,会让初级用户体验标准 VNC 查看器的基本功能。
另外,您也可以在协议的另一端有所作为。也就是说,安装使用流行的和熟悉的 VNC 客户端,但是向它们输送信息的 VNC 服务器则是自己定制的。下面我们将会看到,
为什么这很可能甚至比典型开发所取得的回报还要快。
如果您是新接触 VNC 性能,那么请在下面的
参考资料 部分找到到 "Getting Started with VNC" 的链接。多数 Linux 发行版包含基本的 VNC
客户端和服务器,所以您只需要很少的学习和实践就可以理解本文的思想。
X、Tarantella 和其他技术承诺提供与 VNC
提供的几乎相同的远程操作技术,但是它们的编程比较困难。不像那些技术那么复杂,您可以让您自己的 VNC 查看器或服务器只需几百行源代码。
tclRFB
使得所有这些切实可行。tclRFB 是由 Mac Cody——Raytheon 的首席物理学工程师创建的。关于 tclRFB,他谈到:“我的意图是考虑创建轻量级的、脚本化的远程
接口,就像 Proxy Tk
一样。”
RFB 是“Remote Frame Buffer(远程帧缓冲)”协议,是VNC 显示的通信协议。VNC 及其信赖 RFB
的配件以前已经用几种语言(包括 C 和 Java)编写过了。但是这些程序和库总是那么难以编写;它们很少鼓励源代码级的重用。Cody 利用高级 Tcl
语言为 VNC 实现了 RFB 并脚本化了应用编程接口(API)。
tclRFB 显著简化了 RFB 访问,从而为我们带来了尽量宽松的编程环境。下面我们将看到,利用 tclRFB 创建 VNC 服务器或客户端只需要很少行数的代码。
而且,Tcl 优秀的图形库意味着基于 tclRFB
的应用程序完全具备传统 VNC 客户端和服务器的性能(有时还具有更多性能!)。Cody 坚持使用所谓的“纯 Tcl”来编写 tclRFB,所以您只需要一个标准的 Tcl
发行版就可以充分利用他的工作。
本文的主体给出了运行示例 tclRFB 客户端和服务器的方法,这些 tclRFB 客户端和服务器可以与任何标准 VNC
程序一起使用。本文总结了一些一般规律,可以帮助您进行开发。
客户端上的 tclRFB
只要很少的时间您就可以自己弄清楚 tclRFB。首先要确保已经安装了 Tcl/Tk 8.4 或更高版本;尽管 tclRFB 不以重要的方式使用 Tcl
的最新特性,但是要删除 8.4 版提供的还没有人使用过的所有方便性也是够麻烦的了。
大多数 Tcl 发行版都需要一个额外的模块来处理 tclRFB。这是因为 RFB
依赖于数据加密标准(Data Encryption Standard,DES)编码,并且美国的出口限制有效地阻止了 Tcl 捆绑 DES。
因此,为了使用 tclRFB,需要下载 tclRFB
和 TclDES 发行版(您将在本文后面的
参考资料部分找到到这些软件包的链接),然后用 $WORKING 进行解压缩:
清单 1.
解压缩 tclRFB 开发所必需的模块
cd $WORKING
gunzip -d tclDES-0.5.tar.gz
tar xvf tclDES-0.5.tar
gunzip -d tclRFB-0.5.tar.gz
tar xvf tclRFB-0.5.tar
|
如果 tclRFB
是一个终端用户应用程序,那么客户就可以非常方便地将它作为单个的可执行文件进行分发。Tcl 当然也为这类“封装”提供功能。但是因为 tclRFB
是一个开发库,所以它的客户端和服务器程序只是讲授它的性能的模型而已,将 tclDES 和 tclRFB 单独存放和“解包”非常容易。出口限制只增强了该决策的透明性和灵活性
。
要看 tclRFB 如何工作,首先需要设置一个传统的 VNC
会话。在一台方便的主机上启动一个服务器,利用一个传统的 VNC 客户端检验它的可访问性;如果您还未熟悉 VNC 操作,那么
参考资料部分将在这一方面帮助您。
在服务器运行时,设置 Tcl 的库搜索路径,并以下面简单的序列启动基于 tclRFB 的客户端:
清单 2. 启动示例 tclRFB 客户端
#!/usr/bin/wish
TCLLIBPATH="./tclRFB-0.5 ./tclDES-0.5/"
export TCLLIBPATH
tclsh tclRFB-0.5/examples/client.tcl
|
在利用网络地址、口令等等配置会话之后,就会看到熟悉的 VNC
屏幕弹出来——但是这里是作为一个 Tcl/Tk 应用程序!
client.tcl 只包括 500
行的简单代码。它相当容易使用,所以 Jeffrey Hobbs——Activestate Tools 的高级开发者采纳它和开放源代码的 Snack
音频程序(参见
参考资料),不到一天时间就创建了原型纯 Tcl 的 Webcast 软件。
client.tcl
的大部分代码都在从事传统的设置和装饰工作:在配置 VNC 会话过程中进行对话和显示。就 Tk 的高性能“照片级图像”而言,“活跃的”、特定于 VNC 的部分包含 RFB
协议的实现。下面是一个例子:
清单 3. ProcessColorRectangle 实现
proc ProcessColorRectangleRGB888 {pixel x y w h} {
set pixel [string range $pixel 2 end]
screen put #$pixel -to $x $y [expr {$x + $w}] [expr {$y + $h}]
return 1
}
|
该例子用一种特定的颜色更新了 VNC 显示的一个矩形部分。其余客户端源代码也是可读的。
在服务器端,tclRFB
返回更多
基于 tclRFB 的 VNC 服务器可以更加紧凑。作为 tclRFB 发行版的一部分提供的
rfbcounter.tcl
例子的长度不到 300 行。
这是实用的,因为服务器不必由自己来完成一般目的的图形呈现。聪明的代码编写将 RFB
消息合成在一起,客户端将这些消息一起放到一个图像中。服务器只需要计算内存数据的模式。在这种特定的情况下,Cody 定义了一个简单的七段“LED
样式”的显示元素。只用了很少几行源代码,Siemens Dematic Postal Automation 的 Richard Suchenwirth
就展示了如何利用他的
strimj 软件包获得更加复杂的结果。
一个工作示例使之更加明显。以一个当前的 Tcl 8.4
开始;这节省了完全的 Tcl/Tk 安装额外需要的几兆字节的空间。
当然,如果比较方便,您也可以选择在服务器端使用
wish ,因为
wish
是
tclsh 的一个正确的超集。像前面一样,解压缩 tclRFB。阅读
边框内容,以设置会话口令。利用下面的清单启动 VNC 服务器:
清单 4. 启动示例 tclRFB
服务器
#!/usr/bin/tclsh
TCLLIBPATH="./tclRFB-0.5 ./tclDES-0.5/"
export TCLLIBPATH
tclsh tclRFB-0.5/examples/rfbcounter.tcl -clock 1
|
现在,将任何 VNC 客户端指向在运行
rfbcounter.tcl
的主机上的显示 1。您将会看到类似于图 1 所示的显示,即一个简单的数字时钟。
 |
设置会话口令
rfbcounter.tcl
是开发者可以采纳的一个示例,而不是为了终端用户的方便而设计的应用程序。它的 VNC 会话口令的配置很笨拙,尽管按照 Cody
的话来说,任何简单的更换都不行,但是这正是它吸引人的地方,即可以具有一个在进程表中或其他公共的地方都可见的明文口令。
因此,下面是为使用
rfbcounter.tcl
而设置会话口令所需要的:如果您已经从使用传统的 VNC 服务器而具有了一个
$(HOME)/.vnc/passwd 文件,那么
rfbcounter.tcl
将找到并使用它。您为您最近的 VNC 会话定义的会话口令将是 tclRFB 服务器所接受的那个口令。
tclRFB
发行版包括用于加密和建立会话口令的代码。但是如果您不具有一个
$(HOME)/.vnc/passwd
文件,那么运行您的第一个试验最简单的方式是直接编辑
rfbcounter.tcl: 将第 104 行从:
set optList [concat $optList [list passwd {}]]
更改为类似于:
set optList [concat $optList [list passwd MYPASS]]
当您启动服务器时,它将使用 MYPASS 作为会话口令。
确保具有当前的 0.5 版本;tclRFB
的较早版本包含一个错误,即不能正确识别少于 8 个字符的口令。
|
|
图 1. VNC 传输的简单数字时钟的显示
您看到该模型打开的可能性了吗?假设您要监视远程主机上的一个操作。 要做到这一点,我们通常通过编写一个 Web 应用程序,或者通过开发一个自定义的客户-服务器对来实现。Web
应用程序的一个众所周知的局限性当然是它们在更新方面的笨拙——尤其当整个客户端窗口必须刷新时。自定义的客户-服务器的开发也会面临以下问题:不仅要适应一个长长的通信协议,还要将客户端部署到所有需要监控远程主机的桌面或其他主机。
但是手头有了 tclRFB 之后,您可以编写一个小的特定于应用程序的服务器——当然比任何您喜欢使用的动态 Web
服务器要小。将该服务器放在一个平台上,该平台只要具有足够的可以处理 TCP/IP 栈和比 Tcl 需要的稍多的计算能力即可;该平台可以是 PocketPC、OS/400
小型机,或者是一个嵌入在打印机、网络设备或其他物理设施中的处理器。记住:与 Web 服务器相比,基于 tclRFB
的服务器只处理文本和算法数据,并且不需要图形显示的直接知识。
从某一点说,这听起来像用作网络管理“代理商”的简单网络管理协议(Simplified Network Management Protocol,SNMP)模型——但是具有这样一个优点,即监视器显示已经安装在任何对标准 VNC
客户端具有访问权的屏幕上。不再需要部署昂贵的“管理控制台”。
组合相同的元素还有其他几种方式。正如 Cody 所说的,“使用 Img 扩展名的 tclRFB,允许创建 Tcl/Tk
应用程序的一个后端,使该应用程序可以动态地‘屏幕刷新’GUI,并将该刷新传递给可以与之交互的远程用户,而不再需要远程传递整个的桌面。”
然而 tclRFB
使之切实可行的另一个“刷新”变体是,将遗留的“绿屏”应用程序转换成图形服务器。假设您想要终端用户从一个遗留的“非图形的”平台来监视信息。Web
应用程序不适合这类情况。但是您可以利用一个 tclRFB 服务器,并通过依赖于标准的 VNC 客户端而避免部署困难。一个附加的好处是,简单的
strimj
编码可以利用任意的 Unicode
或其他特殊目的的图形来增加显示,而不需要在客户端桌面上安装额外的字体。客户端将看到他们从未打过交道的那些罕见的或陈旧的服务器带来的奇特的画面。
图 2. 作为 strimj 编码的“ASCII 艺术”而得到的好看的图标
所有这些可能性背后的原理是,采用标准协议和标准组件以及一个编写良好的可成倍提高开发者工作效率的库。您喜欢 VNC 主题方面的哪些变化?
参考资料
关于作者
对本文的评价
|