IBM®
跳转到主要内容
    中国 [选择]    使用条款
 
 
Select a scope: Search for:    
    首页    产品    服务与解决方案     支持与下载    个性化服务    
跳转到主要内容

developerWorks 中国  >  Linux  >

利用 tclRFB 创建 VNC 系统

developerWorks
文档选项

未显示需要 JavaScript 的文档选项


级别: 初级

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 ,因为 wishtclsh 的一个正确的超集。像前面一样,解压缩 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 传输的简单数字时钟的显示
digital VNC clock display

您看到该模型打开的可能性了吗?假设您要监视远程主机上的一个操作。 要做到这一点,我们通常通过编写一个 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 艺术”而得到的好看的图标
strimj-based ASCII art

所有这些可能性背后的原理是,采用标准协议和标准组件以及一个编写良好的可成倍提高开发者工作效率的库。您喜欢 VNC 主题方面的哪些变化?



参考资料

  • 您可以参阅本文在 developerWorks 全球站点上的 英文原文.

  • AT&T VNC 主页 提供了背景信息和下载(遵循 GNU GPL)。特别注意与另一种技术 X 的外在比较,该技术提供 $DISPLAY 重定向。



  • 如果您以前从未启动过 VNC,AT&T 的教程 Getting Started with VNC 可能是开始学习如何在工作中使用 VNC 的最佳地方。



  • " VNC works miracles for system administrators" 是一篇介绍性文章,是在五年前,VNC 的第一个公共版本发布之后不久,由 Cameron 所写的。



  • VNC 协议”页描述了 RFB。



  • TclRFBTclDES 都可以在 SourceForge 上找到。



  • DES 加密”介绍了这一标准的加密算法。



  • developerWorks 的“在 Linux(或不同种类的)网络上共享计算机”系列文章,描述了 ssh(即secure shell)和 VNC (Virtual Network Computing) 的使用。 第 1 部分developerWorks, 2001年12月)讨论了这些技术在哪方面有效以及一些设置问题。 第 2 部分developerWorks, 2002年3月)介绍了 VNC 的更多知识,然后介绍了 X Window System 和安全问题。



  • IBM Redbook tip 介绍了 SuSE 8.0 Linux 的安装和使用 VNC 来进行远程管理。



  • Cameron 的 personal notes on the X Window System 具有介绍 Linux 的底层图形工具包的链接。



  • Tarantella 是一个雄心勃勃的产品,强化了应用程序的显示,并使之可作为 Web 页面得到。



  • " Proxy Tk: A Java applet user interface toolkit for Tcl" 是一篇会议论文,描述了这一有趣的专有开发工具,该工具简化了 Web 应用程序中复杂的可视效果(PDF 格式)的实现。



  • 在 " Expect 超出预期" 一文中( developerWorks, 2002年4月),Cameron 解释了 Tcl 的一些特性和优点。



  • Snack Sound Toolkit 是用于脚本化音频操作的一个跨平台的库。



  • 在 " Economy of Means" 一文中,Cameron 谈到了 strimj 软件包的简洁性。



  • Cameron 的 personal notes on SNMP (Simple Network Management Protocol)涉及 SNMP 的介绍、标准和讨论。



  • Img 是标准 Tk 的一个扩展,使之可以处理像 PDF、XBM 和 TIFF 这样的图像格式。



  • Tcl Developer Xchange 是公认的 Tcl 编程语言的标准 Web 主页。



  • developerWorks Linux 专区 能够找到 Linux 开发者的更多资源。




关于作者

Cameron 是 Phaseit 公司的一名全职顾问。他经常就开放源代码和其他技术主题发表文章和演讲。您可以通过 claird-at-phaseit.net 与 Cameron 联系。




对本文的评价

太差! (1)
需提高 (2)
一般;尚可 (3)
好文章 (4)
真棒!(5)

建议?







回页首


IBM 公司保留在 developerWorks 网站上发表的内容的著作权。未经IBM公司或原始作者的书面明确许可,请勿转载。如果您希望转载,请通过 提交转载请求表单 联系我们的编辑团队。
    关于 IBM 隐私条约 联系 IBM 使用条款