JAVA中即时通讯内容扩展研究

2016-01-05 12:00徐曙民张伟��
软件导刊 2015年12期
关键词:嵌入插件自动化

徐曙民++张伟��

摘 要:针对目前市场中即时通信软件不能提供矢量图形、图表、公式等信息编辑功能的问题,阐述了以插件方式在即时通信软件聊天框中嵌入Word的优点,研究了嵌入及自动化操作方法,设计并实现了一款基于聊天软件Spark的扩展插件。该扩展插件能够在不影响通信系统基本功能的前提下,为即时通信软件Spark提供特殊信息的即时编辑修改功能。

关键词:JAVA;即时通信;嵌入;自动化;插件

DOIDOI:10.11907/rjdk.1511055

中图分类号:TP303

文献标识码:A 文章编号文章编号:16727800(2015)012000104

基金项目基金项目:中铁四局远程教育平台项目(20140912)

作者简介作者简介:徐曙民(1990-),男,湖南长沙人,中南大学软件学院硕士研究生,研究方向为即时通讯、网络技术;张伟(1972-),男,黑龙江哈尔滨人,博士,中南大学信息科学与工程学院讲师、硕士生导师,研究方向为软件工程、大数据及知识工程、模式识别。

0 引言

当前市场中腾讯QQ、MSN等即时聊天软件以其良好的交互界面、客户体验和不断完善、创新、增强的服务功能备受广大用户欢迎。此类聊天软件的设计初衷是为普通用户提供日常通讯需求,通信软件中的魔法表情、视频通信、语音通信等功能,丰富了用户的通信方式。

然而,随着信息时代专业分工日趋深化,此类即时通讯软件却不能提供专业化数据即时输入和修改功能。例如,许多大型企业在资金核算或人事调整时,需要很多图形、图表数据描述企业实时资金或人事状况,而现时却只能以图片的形式发送此类信息。

随着高等院校教学科研工作的深入开展,学生在实验、课程设计等教学科研活动中需要用到的信息也日趋复杂,目前的即时通讯软件很难满足此类信息的即时修改和输入功能。例如,数学公式、化学公式、物理公式作为描述事物内部和外部关系的一种表达方法,在现代科技中具有不可替代的作用,但此类信息却不能即时修改和输入。

本文提出一种将Word嵌入即时通信软件聊天框的方式,在即时通信过程中将图形、图表等信息以XML的形式发送和显示,使用户可以在聊天框中即时编辑以上内容。考虑到市场中绝大多数开源即时通信软件使用JAVA语言的因素,文中采用SWT图形库与ActiveX控件结合的方法,开发人员可以在不影响即时通信软件基本功能的前提下以插件的方式嵌入到该软件中。

1 聊天信息显示容器

市场中对于二维矢量图形、数学符号和公式这些复杂的信息内容,一般采用SVG(Scalable Vector Graphics)、MathML(Mathematical Markup Language)这些基于XML标准的扩展标记语言描述[12]。由于扩展语言的标准不同,所以这些信息的容器仅支持单一类型信息的显示与编辑,例如MathType、MathMagic等编辑器仅支持MathML描述的公式显示与编辑, Cairo、Graphviz等编辑器仅支持SVG描述的矢量图形修改。

2007 Microsoft Office system中采用的Office Open XML格式,使用ZIP和压缩技术来存储文档,支持多种XML标准的扩展标记语言,为SVG、MathML等语言描述的信息提供了一个良好的显示和修改容器,所以仅需将Office应用程序嵌入即时通信软件聊天框,即可实现显示和修改此类信息的需求。

2 显示容器嵌入

Office本身不支持作为即插即用对象嵌入其它应用程序,需要采用系统原生外壳包裹。SWT(Standard Widget Toolkit)作为IBM开发的一套用于Java的图形用户界面系统[3],采用如下思想创建组件:在系统组件存在的情况下,采用系统原生组件,在系统组件不存在的情况下,创建模拟组件。

如图1所示,系统提供原生组件包裹Word,SWT在原生组件上覆盖了一层JNI映射,所有操作系统的API调用将会映射到这个JNI调用上,JNI 封装部分SWT的C代码部分, JNI Wrapper部分只是各平台GUI API的JNI简单映射,SWT通过Java Peer填平了各平台差异,从而给Application提供统一的SWT API接口。例如本文中,Application采用SWT API提供的OleFrame作为OLE嵌入的顶层框架,OleClientSite作为包裹Word和Activex的容器。

图1 SWT底层结构

3 客户端中自动化技术应用

在客户端接收与发送消息时,需要将后台中的信息在嵌入了Word的聊天框中显示出来,此时通过自动化技术,在程序与COM组件之间建立一个连接,实现组件间的直接调用与数据交换。在此过程中,自动化程序作为一种实现了IDispatch接口的COM组件,响应应用程序请求,承担类似自动化服务器的功能[4]。

3.1 JACOB与dom4j

JACOB编写了操作COM组件的Java类[5],并利用JNI技术将自动化接口相关的函数调用声明为本地的方法。利用C++实现了与WIN32平台下COM组件的沟通。将C++编写的程序编译为“Jacob.dll”库文件,与Java类包整合起来,完成了Java程序与COM组件的连接通路。虽然JACOB完成了Java与COM组件的桥接,但却无法获得SWT中Word的IDispatch值,无法对嵌入后的Word进一步操作。

dom4j是一个用来读写XML文件的Java API。由于2007 Microsoft Office system中采用Office Open XML格式来存储信息,所以利用dom4j对Word进行操作也是一种可行的方式。但是Java语言的平台无关性使它与本机的内部联系很少,尤其是在软件复用方面。在dom4j中表现为需要将Word关闭后方能对其操作,采用此种方法对Word操作时会造成聊天显示框短暂性关闭,用户体验不好。

3.2 ActiveX in SWT

由于SWT采用原生组件的特性,使得SWT在Windows中对ActiveX调用有一定优势。同时SWT封装了Windows内大部分的Win32 API,所以在Word嵌入SWT后,可以将ProgramID值Word.Document传给OleClientSite并挂载到指定的composite引用上。OLE Automation通过构造函数获取OleClientSite中Word原生对象引用指针[6]。通过OLE Automation提供的函数getIDsOfNames获得Office 的Application、Documents对象或EndKey、Unit等相对于IDispatch接口的ID值,将执行指令所需参数和属性通过通用类型包装器Variant转换为Variant类型,最后通过invoke函数执行指令,实现通过Java语言对Word的自动化操作。

4 传输消息优化

采用XMPP协议的即时通信系统传输数据,基本模式是先通过stream标签建立一个XML流,将需要传输的信息嵌入message或者body等XML元素中,组成XML节,服务器再根据客户端发送的信息以及程序逻辑发送XML节。由于XML命名空间提供避免元素命名冲突的特性,所以可在XMPP协议的基础上通过定制化功能传输所需内容。

待发送的信息可以通过两种方式发送:docx文件格式、xml文件格式。Word 2007提供了一种新的文件格式——Microsoft Office Word XML,该格式由一个压缩的ZIP包组成,称为包[7]。Word将包的内容分成许多逻辑部件,每个部件存储一个特定的文档。Document.xml作为主要的文档信息存储,是Word XML格式中唯一需要的部件。[Content_Types].xml作为描述出现在文件中的每个类型文件,与.rels描述文件关系的文件也是相当重要的,所以在传输过程中仅提取这3种文件发送。接收方获取后,通过ZIP工具将所有内容重新按照模块化结构打包为ZIP文档,最后保存为docx文件格式即可。此种传输方法可大大减小所需发送文件的尺寸,减少传输中的带宽及时延。

5 软件开发实例

中铁四局远程教育平台项目,使用Java作为应用层的语言工具。其中,某个功能便是将Word以插件的形式嵌入即时通讯系统的聊天框中。现在以此为例讲解Java中即时通信软件通过插件方式在聊天框中嵌入Word的方法。

5.1 通信系统总体结构

通信系统主要组件包括:实时服务器Openfire、XMPP协议及其实现类库Smack、客户端Spark及其扩展插件SparkPlugin。Openfire 是遵从 GPL 协议的开源软件,是用Java开发的实时协作服务器[8]。Smack是一个XMPP 可扩展消息处理现场协议的Java 实现[9],提供一套可扩展的API。客户端通过Smack与实时服务器Openfire通信,获取用户之间通信所需要的连接信息,系统结构如图2所示。

5.2 插件的主要类及功能

插件入口类:继承并实现了Spark API提供的Plugin接口, 该接口定义了插件的逻辑实体。在实例化静态管理类SparkManager后通过重写Plugin的initialize方法,将传输所需的JID、客户端版本号等信息传递给消息收发类。

图2 通信系统总体结构

图形界面类:在该类中利用SWT提供的OleFrame作为顶层框架,OleClientSite作为Word容器,将Word嵌入聊天显示框中。通过JAVA语言对Activex控件Word.Document的控制,实现Word的自动化操作功能,使得消息能够自动显示在嵌入了Word的聊天显示框中。

消息收发类:此类为线程在插件入口类初始化时执行,通过插件入口类中提供的连接信息connection初始化FileTransferManager等管理器类,在接收或发送文件请求时添加一个监听匿名内部类,通过重写该接口中request方法接收文件或者消息。

历史消息管理类:利用Java7 NIO2文件系统的相关事件处理API,创建 WatchService 实例,同时为需要监视的目录创建一个Path类对象,调用Path对象的register()方法。当接收方接收消息包后,创建、修改历史消息文件目录。当这类事件发生后会触发WatchService返回相关类WatchKey,以此执行一系列的WatchEvent,比如调用图形界面类中的显示方法,将接收消息显示在聊天框中。

5.3 插件与Spark的无缝集成

Spark 作为一个开源的、 跨平台的即时通讯客户端软件[10],提出了一种很好的插件框架。

创建工程时,需将sparkplug解压出来的builder、spark文件夹拷贝到项目目录下,提供插件所需的库文件和配置文件。同时需要通过builder中的插件描述文件plugin.xml描述自身的基本属性,比如版本号、插件ID、作者、插件入口等信息。插件加载过程中,插件管理器会根据plugin.xml中描述的依赖关系选择插件加载顺序。插件开发完成后仅需通过Ant打包为JAR压缩文件形式,拖放到Spark客户端安装插件目录中,Spark启动时会加载共享的PluginFrameWork插件管理器,完成插件加载。

本项目通过ChatRoom对象获取权限,在聊天框中嵌入包裹着Word的SWT组件,同时通过SparkManager静态中控管理类,生成SessionManager、UserManger等管理器,赋予插件对于当前会话信息、用户信息的处理能力,使Word作为插件嵌入Spark聊天框后,获得Spark发送和接收消息的能力。

5.4 插件工作流程

在通信过程中,用户输入消息并点击发送按钮时会触发插件监听,将输入信息打包为XML格式信息包或者docx格式文档保存。通过SparkAPI提供的SessionManager获取发送信息所需的XMPP全局标示符JID,客户端与实时服务器的连接引用connection以后发送消息。

接收方的历史消息管理类监听到消息记录文件夹中信息的改变,调用图形界面类中的OLE automation方法,将接收到的信息自动显示在接收方界面,消息发送过程如图3所示。

图3 消息发送过程

当发送方与多个好友进行会话,若某个接收方没有加载插件,发送方可以通过发送图片的方式,将信息显示在会话方界面,过程如图4、图5所示。

图4 消息发送流程

5.5 插件效果分析

测试平台由一台服务器(Intel Core i5 1.90GHz 8.00GB Windows 8.1)和两台客户机(Intel Core i5 1.90GHz 8.00GB Windows 8.1)组成。3台测试机位于同一局域网内不同网段,网络带宽为100Mbps。

在输入框和显示框,通过SWT嵌入了Word作为信息显示容器,能够很好地承担图表、公式、流程图等信息的显示和编辑工作。插件点击发送按钮或者接收到消息包之后,将触发OLE自动化操作,相对于利用dom4j等技术对Word的后台操作,无需关闭Word,对信息的处理速度快,消息从接收到显示处理时延为200ms左右,保证了插件使用时用户的体验感。

图5 消息接收流程

6 结语

针对企业和学校等机构在生产设计、人事资金调整、

教学科研等活动需要矢量图形、图表、公式等信息的即时通信需求,详细阐述和分析了在聊天框中嵌入Word的方法,并配合Spark实例加以说明,突出显示了以插件将Word嵌入聊天框的方式,可以在不影响即时通讯软件基本功能的前提下,解决用户间无法进行专业化信息交流的问题,这也是本文的创新之处。

参考文献参考文献:

[1] QUINT A. Scalable vector graphics[J]. IEEE MultiMedia,2003,3(3):99102.

[2] LANDAU R H, VENDINER D, WATTANAKASIWICH P. Future scientific digital documents with MathML, XML, and SVG[J]. Computing in Science & Engineering, 2002,4(2):7785.

[3] 薛笛.SWT全接触[EB/OL]. http://www.ibm.com/developerworks/cn/opensource/osswt/.

[4] 李瑞.JAVA中基于JACOB的COM组件调用研究[J]. 微计算机信息,2007,24(5):168170.

[5] 冯正全.COM原理概述[J].成都信息工程学院学报,2004,19(3):398402.

[6] VERONKIA IRVINE . ActiveX support in SWT[EB/OL].http://www.eclipse.org/articles/ArticleActivexSupportInSwt/index.html.

[7] ERIKA RHRLI .Walkthrough: Word 2007 XML [EB/OL].http://www.microsoft.com/china/msdn/library/office/office/Word2007XMLFormat.mspx?mfr=true.

[8] DAVE CRIDLAND .Ignite realtime: openfire server[EB/OL].http://www.igniterealtime.org/projects/openfire/index.jsp.

[9] FLOW .Ignite realtime:smack API [EB/OL].http://www.igniterealtime.org/projects/smack/.

[10] 张彦,夏清国.Jabber/XMPP技术的研究与应用[J].科学技术与工程,2007,7(6):10331035.

(责任编辑:杜能钢)

猜你喜欢
嵌入插件自动化
自编插件完善App Inventor与乐高机器人通信
创新型人才培养中的文化素质教育嵌入研究
AGV小车在白酒行业自动化立体仓库中的应用
配电室无人职守集控站在京博石化的运用
配电线路运行资料管理自动化的探讨
小微企业全球价值链嵌入模式研究述评与展望
医技预约系统的设计与研究
MapWindowGIS插件机制及应用
基于Revit MEP的插件制作探讨
火力加强再加强IE插件三剑客