首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

XIM协议的原理

XIM协议的原理

引言1.输入法世界上大多数语言是基于字母表的,一些字母的集合组成了单词,当在计算机中输入这些语言时,用户通常是在键盘上键入相应的字符或一些组合键来实现。但表意文字(如中,日,韩等)却不能在键盘上找到相应的键,如果想在计算机中输入这些文字,就需要相应的输入法。输入法有很多种,如拼音,五笔等,但这些输入法的一个共同的特征是用户敲多个键来组成一个文字(或一组文字),统称为编码输入。
2.XIM协议XIM(X Input Method)是X-Window系统下的符合国际化标准的输入法协议,只要应用程序和系统都支持这种输入协议,应用程序就不必具体考虑在不同语言环境下的输入问题,系统可以根据相应的locale去寻找相应的输入法,从而达到国际化的要求。
XIM的原理1.体系结构
  • 1.1 实现模型   在X-Window 系统环境下,XIM的实现有以下两种典型的体系结构:           1)Client/Server模型:
    IM服务器是一个独立的进程,由它来处理输入、预编辑、转换和确认。IM库存在于应用程序中,就象IM服务器的一个客户,它只是简单的从IM服务器接收确认字符串。
    2)Library模型:
    所有的输入都由应用程序中的IM库来处理。事件处理在IM库中就被关闭了,所以就不再需要一个独立的IM服务器。
    大多数语言,如亚洲语言一般都有复杂的预编辑,所以都采用Client/Server模型来实现,其他的只有一些死键或组合键的语言,如欧洲语言一般都采用Library模型来实现。
    下面主要都讨论Client/Server模型,如图1所示:            

    客户程序通过连接IM服务器来实现XIM输入,它们之间的通讯是利用XIM的协议来实现的。IM子系统完成文字查找和文本的组合。
  • 1.2 IM结构   当客户程序向服务器发出连接或断开请求时,在客户和服务器之间会产生打开和关闭操作。          函数XopenIM()设置或修改客户的locale,IM是根据相应的locale来指定的。另外,客户支持的IM类型可以通过函数XGetIMValues()来获得。
    一个客户程序通常有多个输入域,Xlib提供了一个结构“Input Context”(IC)来管理每个输入域。函数XCreateIC()可以指定XIM并创建一个相应的IC,函数XDestroyIC()用来删除此IC。许多重要的信息,比如确认字符串都通过IC来从IM服务器送到客户程序。每一个IC与一个输入域相关,函数XSetICFocus()用来通知IM服务器当前IC获得了焦点(XUnSetICFocus()表示失去焦点)。
  • 1.3 事件处理模型   现存的输入法都支持前端输入法和后端输入法或其中的一种。XIM把后端输入法作为一种默认的输入法,但也支持前端输入法。           1)后端输入法:
    在后端输入法中,客户窗口的输入事件总是送到IM库中,然后IM库把此事件送到IM服务器中。事件以传送的顺序来处理,因此在IM库和IM服务器中没有需要同步的问题。
    2)前端输入法:
    在前端输入法中,客户窗口的输入事件由XServer直接传送到IM库和IM服务器中。因此这种方法提供了更好的接口性能(尤其在IM服务器运行在一台工作站而客户程序运行在另一台工作站上,且网络又相对较慢时)。而,前端模型在处理键的时候有同步问题,时会引起事件丢失或时间重复。因此后端输入法是由核心输入法支持的,前端输入法是从扩展性能的目的出发的。
  • 1.4 事件流控制          XIM协议在IM库和IM服务器之间的通讯支持两种事件流:静态和动态。
    1)静态事件流是客户程序的输入事件总是发送到IM服务器。
    2)动态事件流是输入事件中需要处理的事件发送到IM服务器。例如,在即输入ASCII字符又输入中文字符的时候,ASCII字符就不必送到IM服务器了。因此,采用动态事件流后,在XServer、客户和IM服务器之间的需求事件大大减少了,从而性能有所提高。IM服务器发送XIM_REGISTER_TRIGGERKEYS事件来切换动态事件流。
2.简单协议处理模型下图2是一个最简单的协议流的例子:        

当应用程序发生按键事件时,它调用Xlib API的XNextEvent函数,对于后端输入法模型,事件都由IM库来处理,IM库先发出XIM_FORWARD_EVENT作为同步请求,IM服务器接收到此协议后发出XIM_FORWARD_EVENT或XIM_COMMIT作为同步应答,双方完成同步。然后,IM服务器阻塞从IM库接收到的XIM_FORWARD_EVENT消息,进行处理,结束后把结果返回到应用程序。
XIM开发工具IMdkit简介IMdkit(IMServer Develops Kit)是X11R6的Xi18n执行工作组发布的XIM服务器开发工具,它提供了一个低级的C语言接口,把每个IM协议操作都绑定到了简单的C语言接口,这样用户就可以很容易的使你的IM服务器与XIM客户程序很容易的通讯,而不用直接处理复杂的IM协议。XIM客户程序是指利用在X11R6中定义的XIM API国际化过的应用程序。IMdkit封装了实际的IM协议操作,这样用户自己就不必处理实际包,可以利用它提供的数据结构,简化了许多细节麻烦;封装了不同的传输机制(包括X协议,TCP/IP,DECNET),这些协议用来在IM库和IM服务器之间传输数据包;封装了多种IM协议模型,包括Ximp和Xi18n。
IMdkit定义了一个不透明的数据结构XIMS,用来抽象输入法服务器的结构。它由函数IMOpenIM返回,函数IMOpenIM如果成功的话,返回一个XIMS结构,否则返回NULL。
对于每一个XIM协议输入,在IMdkit的头文件中都定义了一些相应的结构,对于R6标准的IM协议模型,中定义了所有的IM协议结构。
1)IM协议的通用数据结构
在R6的标准IM协议模型中,所有的事件结构有如下的通用成员:
1
2
3
4
5
typedef struct{
int major_code;
int minor_code;
CARD16  connect_id;
}




major_code和minor_code指定了唯一鉴别这个IM协议类型本身的常量名。connect_id指定了连接的客户ID。
2)协议处理
一些由IM库发送的IM协议请求由IMdkit内部处理了,不需要发送到IM服务器。因为IMdkit会根据你在XIMS结构中设置的值来决定对这个IM协议请求的应答。需要处理的一些IM协议请求参看下面介绍的XIM的实现。
返回列表