大家用过Google Talk吗?它是Google推出的一个IM,通讯协议是我们熟悉的Jabber协议。我通过这篇文章给大家简单介绍一下如何利用ECF实现一个Google Talk客户端。源代码下载:
http://www.blogjava.net/Files/reloadcn/Chat.rar1.准备工作先下载ECF:
www.eclipse.org/ecf为了能够测试我们这个客户端是否能正常运行,我们还需要下载一个Goolge Talk客户端:
www.google.com/talk当然,我们想要登陆Google的服务器必须拥有一个GoogleMail帐号,由于现在GoogleMail帐号不是随便申请的,需要GoogleMail用户推荐才能申请,但也能通过一些网站进入GoogleMail申请页面,大家可以上网搜索一下,我在这里就不多说了。
我们要建立一个Google Talk的客户端,需要了解一些ECF的知识。大家可以去Eclipse主站获得更多的信息。
2.建立一个RCP Mail Example
我们先选择创建Plugin Project,取名为“Chat”,当到向导页的第二页的时候,注意在“Would you to create a rich client platform”选项选择“yes”,这样确保你创建的是一个RCP工程,见下图:
当到最后一页的时候,选择Mail Template:
完成向导后我们将会得到一个简单的RCP工程。
3.登陆的代码
1)连接前工作
ECF是一个基于Eclipse的通讯平台,它其中一部分实现了Jabber协议。ECF有一个ClientContainer概念,其实就相当于一个维护客户端的对象,它具有连接、断开连接服务的方法,并且能够添加一些通讯中的事件监听器。所以,我们创建Google Talk客户端首先就要拥有这么一个对象,而且它在整个程序生命周期中是唯一的。
让我们修改一下ChatPlugin中的代码:
首先,我们在这个类里增加一个私有变量clientContainer,并且给他加上Getter、Setter方法:
XMPPClientSOContainer clientContainer;
public XMPPClientSOContainer getClientContainer() {
return clientContainer;
}
public void setClientContainer(XMPPClientSOContainer clientContainer) {
this.clientContainer = clientContainer;
}
OK,试想一下,当我们在登陆Google服务器的时候才会去使用这个clientContainer去连接服务器,而且我们登陆的用户信息是需要保存下来的,以供后面的代码访问,所以这个clientContainer的生成方式应该是Lazy的,并且我们还需要建立一个我们登陆帐户的变量:
private ID userID;
public ID getUserID() {
return userID;
}
public void setUserID(ID userID) {
this.userID = userID;
}
ECF中针对用户的信息是用ID来表示的,它是一个接口,ECF已经实现了一个XMPPID,正好是我们Jabber帐户需要的。
clientContainer有一个connect方法去登陆服务器,而且在连接后不再具有其他什么动作。读者会问:那什么时候通知我们连接成功呢?并且用户在服务器端的好友怎么获得呢?
clientContainer只负责连接,上述的那些事情都属于在连接服务器过程中或者连接后,服务器反馈给客户端的信息,这些信息需要我们给clientContainer设置监听器去捕获。
其中有一个监听器名为ISharedObjectContainerListener,这个监听器能够捕获一些在连接过程和断开连接过程中的事件,比如SharedObjectConnectedEvent (连接成功事件)、SharedObjectDisconnectedEvent (断开连接成功事件),如果我们需要在客户端连接上服务器后做点什么,那这个监听器是必须的。
clientContainer.addListener(
new ISharedObjectContainerListener() {
public void handleEvent(IContainerEvent evt)
if (evt instanceof ISharedObjectContainerConnectedEvent) {
// 连接服务器成功后做点什么呢?
}
if (evt instanceof ISharedObjectContainerDisconnectedEvent) {
// 断开服务器成功后做点什么呢?
}
}
}, null);
2)开始连接服务器我们看看clientContainer有一个connect方法。
这个方法需要有两个参数:用户的ID、连接上下文
用户ID我们刚才已经说过了,它是ECF提出的一个概念,我们可以通过IDFactory生成它:
userID = IDFactory.getDefault().makeID(
clientContainer.getConnectNamespace(),
getUserName());
大家发现了吗,上面代码中的makeID方法需要两个参数,一个参数我们可以从clientContainer获得,它是连接名字空间,我的理解是某种协议。第二个是用户名,这个参数在我们这里是Google Talk的帐号,也就是GMail帐号,但是目前我们还没有办法从外部获得,这我会在下面的内容中提到,到时候就可以将这个程序串起来,大家现在可以把它看作已经具备某些值。
好,我们已经有了ID,现在看看什么如何创建上下文。连接上下文其实很简单,我们可以这样理解:就是在我们连接的时候,clientContainer会向客户端所取一些相关的信息,比如nikename,password,这样理解起来就不麻烦了,而且在我们的这个Google Talk客户端中,它也只会向我们索取password和username,来看看我们代码就更清楚了:
clientContainer.connect(userID, new IConnectContext() {
public CallbackHandler getCallbackHandler() {
return new CallbackHandler() {
public void handle( Callback[] callbacks)throws IOException,
UnsupportedCallbackException {
if (callbacks == null)return;
for (int i = 0; i < callbacks.length; i++) {
if (callbacks[i] instanceof NameCallback) {
NameCallback ncb = (NameCallback) callbacks[i];
ncb.setName(getUserName());
} else
if (callbacks[i] instanceof ObjectCallback) {
ObjectCallback ocb = (ObjectCallback) callbacks[i];
ocb.setObject(password);
}
}
}
};
}
});
到目前为止,我们已经完成了连接这个环节,我们将这些代码都封装到ChatPlugin的login方法中,到时候通过外部的操作好调用。