会员控制台 会员登陆 会员注册 最后更新 高级搜索 会员投稿 退出登陆
设为首页
收藏本站
留言给我
  首页 | 操作系统类 | 程序设计类 | 数据库类 | 应用服务类 | 网络及硬件类 | 其他技术 | GBunix论坛
操作系统类
程序设计类
数据库类
应用服务类
网络及硬件类
其他技术
Unix中文 / 操作系统类 / Linux / 远程控制 KDE 应用程序
远程控制 KDE 应用程序
2005-01-10    肖文鹏    www-900.ibm.com    点击:
远程控制 KDE 应用程序
  应用程序的远程控制指的是当其正处于运行状态时,除了能够接受通常的用户动作之外,还可以被命令行中的命令甚至脚本进行操作。DCOP是KDE桌面环境中的进程间通信协议,它允许程序向外界暴露自己的一些接口,也是实现对KDE应用程序进行远程控制的基础。

一、简介

对许多Linux用户来讲,基于命令行的操作模式和强大的脚本功能是最能吸引他们的原因之一,这也难怪为什么像Netscape这样基于图形界面的应用程序,会专门提供相应的远程控制(remote control)功能,以便用户能够在命令行方式下对其进行控制。显然,如果Linux下的GUI应用程序能够在运行的时候很方便地通过命令或者脚本进行控制,那么它就能够更好地同其它程序进行功能集成和操作协同,从而也就更容易被广大用户所接受。遗憾的是,要想在程序中实现类似的功能并不容易,因为这会牵涉到进程间通信等诸多技术难题,好在KDE提供的DCOP(Desktop COmmunication Protocol)简化了这一工作。

DCOP是一个轻量级的桌面通信协议,它采用了非常简单的通信模型:每个用到DCOP的应用程序都是一个客户端(client),它们通过共同的DCOP服务器进行交互,DCOP服务器在整个KDE桌面环境中只有一个实例,它在KDE初始化时被自动创建,主要用来完成诸如消息派发这样的协调工作。

从KDE 2.0开始,DCOP就逐渐成为了在KDE应用程序间进行通信和交互的标准方法,凡是实现了该机制的KDE应用程序都能够向外界暴露自己的一些功能性接口,这样其它程序(不一定非得是KDE程序)如果需要的话就可以通过对这些接口的访问,来请求KDE应用程序完成相应的功能。如果仅仅从技术角度来看,DCOP只不过是一个基于socket的进程间通信协议;但如果从用户的观点来看,DCOP却可以成为通过命令行控制KDE应用程序的强大工具。

二、实用工具dcop

设计良好的KDE应用程序通常会暴露一组DCOP接口,以便用户能够通过特定的命令对其进行远程控制,KDE提供的实用工具dcop可以用来对这些接口进行操作,其语法格式为:

dcop [application] [object] [function] [arguments ...]

KDE提供的DCOP是一个轻量级的桌面通信协议,它与GNOME下的Bonobo以及Windows下的Automation机制相比,暂时还缺乏与之对应的激活机制,也就是说只有当前正在运行着的进程才有可能通过DCOP进行控制。执行不带任何参数的dcop命令,可以列出所有符合这一条件的KDE应用程序:

[root@linuxgam dcop]# dcop
kwin
kicker
kwrited
kded
knotify
kalarmd
klauncher
khotkeys
konsole-7897
kmail
kdesktop
klipper
konsole-1787
ksmserver

通常说来,采用DCOP进行通信的基本执行单元是进程(process)而不是应用(application),因此如果同一个KDE应用程序被用户执行了多次(即产生了多个进程),DCOP会自动在其名称后面加上相应的进程标识符(PID)来进行区分。从上面的输出结果中不难看出,当前有两个konsole应用程序正在运行中,它们的PID分别为7897和1787,在dcop命令中使用通配符"*"可以很方便地对它们进行查询:

[root@linuxgam dcop]# dcop konsole-*
konsole-7897
konsole-1787

对于每一个KDE应用来说,能够用DCOP控制的对象(object)一般会有多个,它们同样可以用dcop命令查询出来:

[root@linuxgam dcop]# dcop konsole-7897
KBookmarkManager-/root/.kde/share/apps/kfile/bookmarks.xml
KBookmarkManager-/root/.kde/share/apps/konqueror/bookmarks.xml
KBookmarkNotifier
MainApplication-Interface
konsole (default)
konsole-mainwindow#1
ksycoca
session-1

DCOP为每个KDE应用都定义了默认操作对象,其名字一般与程序名称相同(如konsole),或者是程序名称再加上Iface(如KMailIface),不过也可以通过default关键字进行引用。下面的命令列出了KMail默认对象支持的所有操作函数,它们实际上就是KMail暴露给外界使用的核心功能接口:

[root@linuxgam dcop]# dcop kmail default
QCStringList interfaces()
QCStringList functions()
void checkMail()
QStringList accounts()
void checkAccount(QString account)
void openReader()
int openComposer(QString to,QString cc,QString bcc,QString subject,QString body,int hidden,KURL messageFile)
int openComposer(QString to,QString cc,QString bcc,QString subject,QString body,int hidden,KURL messageFile,KURL attachURL)
int openComposer(QString to,QString cc,QString bcc,QString subject,QString body,int hidden,QString attachName,
QCString attachCte,QCString attachData,QCString attachType,QCString attachSubType,QCString attachParamAttr,
QString attachParamValue,QCString attachContDisp)
DCOPRef openComposer(QString to,QString cc,QString bcc,QString subject,QString body,bool hidden)
int sendCertificate(QString to,QByteArray certData)
void compactAllFolders()
int dcopAddMessage(QString foldername,QString messagefile)
int dcopAddMessage(QString foldername,KURL messagefile)

KMail是KDE桌面环境提供的一个EMail客户端软件,因此最先吸引我们注意力的是checkMail这一接口,调用它不需要任何参数,也没有任何返回值,其作用是连接到邮件服务器并检查是否有新的邮件到达。用户通过KMail图形界面中的菜单命令可以激活这一操作,此外还能够借助dcop命令来实现相同的目的:

[root@linuxgam dcop]# dcop kmail default checkMail

虽然上述命令执行后不会有任何输出,但如果此时注意观察KMail的话,将发现它会去邮件服务器上查看是否有新的邮件到达,如果有的话则将其取回到本地。KMail提供的另外一个非常实用的操作接口是openComposer,它可以用来在KMail中打开一个新的邮件编辑窗口,并且会将To、CC、Subject等字段事先填好:

[root@linuxgam dcop]# dcop kmail default openComposer xiaowp@263.net "" "" "From Gary" "Testing DCOP." 0 ""

上述命令的执行结果如图1所示:


              图1

三、图形工具kDCOP

kDCOP是KDE桌面环境中的一个DCOP实用工具,利用它可以很方便地执行各种DCOP调用。在命令行方式下执行kdcop命令启动kDCOP之后,它会随即在系统中查询当前所有能够通过DCOP进行控制的KDE应用程序,并将它们提供的各种操作接口以树形方式显示出来,如图2所示:


             图2

dcop和kDCOP提供的基本功能是相同的,但使用kDCOP来控制KDE应用程序要更加简单一些。例如,要想调用KMail提供的openComposer接口,只需先在kDCOP界面上的树形列表内找到相应的项,然后双击打开函数调用窗口,再填入调用时所需要的各种参数并单击确定按钮就可以了,如图3所示:


         图3

当DCOP调用完成之后,相应的返回值会显示在kDCOP主窗口底部的列表框中。使用kDCOP来浏览KDE应用程序支持的所有DCOP接口非常方便,但如果需要直接在命令行方式下进行操作,或者需要同其它命令或者脚本进行协作的话,可能还是得借助dcop命令,在实际运用过程中不妨将两者结合起来。

四、Python绑定pydcop

虽然利用dcop和kDCOP这样的实用工具已经能够很方便地操作DCOP接口了,但在很多场合下还是希望能够直接对DCOP接口进行编程,以便更好地同KDE应用程序进行交互和通信。目前绝大部分KDE应用程序都是用C++语言实现的,可这绝不意味着只有C++程序员才有资格操作DCOP接口,事实上使用Python、Perl和Ruby这样的脚本语言同样能够达到目的。

Python是一门面向对象的脚本语言,其强大的功能开始逐渐被KDE所认同和接受,并在各种KDE项目中得到了广泛的应用,例如著名的KOffice套件中就内嵌了Python解析器,以便能够直接处理用Python语言编写的脚本。pydcop是最新版本的KDE桌面环境专门针对Python语言所提供的一个DCOP功能绑定(binding),利用它可以在Python脚本中对各种KDE应用程序进行远程控制。

要想在Python脚本中与DCOP接口进行交互,首先必须生成一个DCOPObject对象,以建立起与DCOP服务器间的连接。DCOPObject的构造函数有两个参数,一个是要操作的KDE应用程序的名称,而另一个则是要操作的远程对象的名称。例如,下面的Python语句可以生成用来操作KMail默认对象的DCOPObject:

[root@xpcdev root]# python
>>> import pydcop
>>> kmail = pydcop.DCOPObject("kmail", "default")

虽然目前针对Python的DCOP绑定有多个,但pydcop无疑是最容易使用的一个,因为它可以使得Python程序员即使在不了解DCOP协议具体细节的前提下,也能够很轻松地操作DCOP接口。利用dcop或者kDCOP这样的实用工具,我们可以很容易地获得每个KDE应用暴露的DCOP接口,以及每个接口对应的函数原型,之后就可以在Python脚本中直接按函数原形进行调用,而不用进行像序列化(serialization)这样的底层操作,所有具体实现细节都由pydcop绑定负责完成。例如,下面的语句可以调用KMail提供的checkMail()接口,来检查是否有新的邮件到达:

>>> kmail.checkMail()

如果DCOP调用有返回值,用pydcop也很容易处理:

>>> ret = kmail.openComposer("xiaowp@263.net", "", "", "From Gary", "Testing DCOP.", 0, "")
>>> print ret
1

不难看出,用Python这样的脚本语言来操作DCOP接口是很方便的,这是因为与DCOP协议相关的部分都由pydcop很好地封装起来了。事实上,如果要用C++来实现相同的功能,通常要编写更多的代码,而且必须了解DCOP协议的许多细节。

五、小结

DCOP是KDE桌面环境中的进程通信协议,也是用来远程控制KDE应用程序的一个强大工具,因此已经被越来越多的Linux开发者所利用。使用dcop或者kDCOP这样的实用工具,或者使用Python这样的脚本语言,都可以很好地对KDE应用程序进行远程控制,如果将它们结合起来使用的话,无疑将会更有效地利用KDE桌面环境提供的各种资源,并最终提高自己日常工作的效率。

了解更多详情,参与讨论,请进入GBUNIX论坛

http://www.gbunix.com/bbs/index.php
责任编辑: trotter

相关文章
Linux系统中如何实现远程控制 - 05-31 10:51 pm - 点击: 1255
Linux 远程控制方法概述 - 01-10 04:30 pm - 点击: 6281

发表评论 查看评论 加入收藏 Email给朋友 打印本文
给该文章评分
1 2 3 4 5 6 7 8 9 10
平均得分 0, 共 0 人评分
1 2 3 4 5 6 7 8 9 10
发表评论
标题:
内容:
声明:本站资讯均来自互联网,所有文章版权归原作者和出版者所有,如涉及版权问题,请来信告知!
Copyright © 2002-2004 GBunix.com. All rights reserved.