在RFB协议中,定义了剪贴板的支持。分别是ClientCutText和ServerCutText两条消息。前者是将客户端的剪贴板数据发送到服务端,后者正好相反。既然RFB协议中已经有了这两条消息,是不是意味着我们就可以使用剪贴板啦。很遗憾,不是。
目前的linux下的vnc服务器(如tightvnc server)只支持cut buffer这种剪贴板形式,我想将来也不会有其它的支持。原因如下:cut buffer是一种“消极”的Peer-to-Peer的通信方式,在整个过程中,内容的提供者只要将所提供的内容放入cut buffer中,它的任务就完成了。当内容的请求者想要得到数据时,它只要从cut buffer中取出数据,而不用理会内容的提供者是否已经不存在;相比之下,采用“积极”的Peer-to-Peer的通信方式就要复杂得多了。它要求内容的提供者要一直存在,并且当内容的请求者想要得到数据时,请求者与提供者必须进行通信,这个过程涉及多次的应答,更重要的是,要通过XServer来作为中间媒介。单从这一点,vnc就不可能支持如Clipboard或者是Primary这类的selections来进行Peer-to-Peer通信了。因为有谁会为了实现了一小小的剪贴板而把x协议(那怕是一部份)加进rfb协议里呢?
可是cut buffer这个东西太旧啦,技术太落后啦,效率太低啦,格式太单一啦,以至于没有多少软件支持它了。比如gedit,google-chrome等都不支持cut buffer了。这就造成了我们的错觉:vnc的剪贴板使用不了。当客户端拷贝下一串字符串后,你可以在服务器上的相应display下执行xprop -root CUT_BUFFER0,可以看到,事实上数据是有传送到服务端的。
解决这个问题的办法有点"土",就是使用一个工具,在cut buffer与selections之间进行数据的“搬运”。这个程序叫做autocutsel。把如下两行命令