技术开发 频道

Lotus Sametime开发入门


    限于篇幅,本文不可能涉及的介绍客户端toolkit中的所有服务。本文将随着介绍客户端toolkit中的最重要服务带领读者完成一个简单的登录聊天的应用程序(STClient)。有兴趣的读者可以自行阅读本文列举的参考资料和客户端toolkit自带的其他示例程序。

    开发完成后,读者可以通过此示例程序完成如下功能:

  • 登录到Sametime服务器
  • 查找用户
  • 与指定用户一对一聊天
  • 多用户共享桌面

该程序界面如下图所示:

图4:Sametime客户端示例程序:STClient

    为了便于读者理解,本文中的代码只是从程序中摘取的一些片断并做了少许修改,完整的代码可以在参考资料中下载。

Community类服务

1. Community服务(CommunityService): 登录Sametime服务器

    STClient 程序要做的第一步就是登录到Sametime服务器, 这就需要使用toolkit中最基本的一个服务CommunityService,通过它才能登录到Sametime 服务器。另外该服务还可以接收管理员消息,改变用户状态和隐私设置。使用该服务登录到Sametime需要下面几个步骤

步骤一:创建Session对象

session = new STSession("STClient Session" + this); session.loadSemanticComponents(); session.start();

    上面的代码片断首先创建一个STSession 对象,通过它才能装入Sametime的所有服务,在本例中根据我们的需求使用了loadSemanticComponents()方法,toolkit也提供了其他方法来装载特定的服务,请参考相关文档。在STSession使用之前,我们必须调用它的start()方法。

步骤二:,获得Community服务对象并登录

    我们需要通过session对象获得CommunityService的引用并使用loginByPassword()方法登录。注意所有的Sametime的组件都有COMP_NAME属性。

comm = (CommunityService) session.getCompApi(CommunityService.COMP_NAME); comm.loginByPassword(host, user, pwd);

    loginByPassword的三个参数分别是sametime server 地址,用户名和密码

步骤三:实现LoginListener

    因为Sametime是在网络上运行的程序,所以登录过程可能需要一定时间。我们不希望程序一直等待登录成功的确认,所以我们需要实现Listener接口让Community服务在登录成功后通知程序。因此我们需要为Community服务对象绑定LoginListener并实现LoginListener接口的两个方法:loggedIn()和loggedOut()。

    首先在调用loginByPassword()方法前增加语句

comm.addLoginListener(new LoginHandler());

    然后在LoginHandler类中实现LoginListener接口。

public class LoginHandler implements LoginListener{ public void loggedIn(LoginEvent event) { System.out.println("Login successful"); } public void loggedOut(LoginEvent event) { System.out.println("Logout successful"); } }

步骤四:注销

    最后,不要忘记,在程序关闭时,必须要关闭并注销所有Sametime对象。

public void windowClosing (WindowEvent e) { comm.logout(); session.stop(); session.unloadSession(); }


    通过以上这四步,我们可以看到Sametime中基本的设计模式:观察者模式(Observer pattern)。在客户端向服务器发出请求之前(比如Login),先创建一个观察者(如LoginListner的实现类),把它加入到适当的组件中去。这样请求完成以后,观察者的相关方法会被调用(如loggedIn()方法),对结果(比如登录是否成功)进行处理。观察者模式在对Sametime的编程中几乎无处不在,下文中会有更多的示例。

    本小节详细的代码参见示例程序STClient类。

2. Lookup服务(LookupService):查找用户

    登录到系统以后,在向任何一个用户发送消息之前,我们先要获得这个用户的引用。在Sametime toolkit中,用户(User)模型非常重要。简单的来讲,该模型包括静态的User和动态的User, 静态User代表Sametime community中的一个实体,在toolkit中与之对应的是STUser类。一旦用户登录到系统中以后,就产生了一个动态的User, 可用STUserInstance来表示。如果一个用户登录多次,就会产生多个不同的STUserInstance对象。在这里我们只需要获得STUser对象的引用。

步骤一:获得LookupService对象

    同获得CommunityService对象相似,我们通过调用STSession的getCompApi方法,传入LookupService的COMP_NAME属性,并通过强制类型转换获得LookupService的引用。

LookupService lookup = (LookupService)session.getCompApi(LookupService.COMP_NAME)


步骤二:解析用户

    解析用户需要使用Resolver类。我们首先用LookupService对象创建Resolver类,然后使用该类的resolve()方法解析指定用户。

Resolver resolver = lookup.createResolver(false, // 返回所有匹配 false, // 非穷尽搜索 true, // 返回搜索到的用户 false); // 不返回搜索到的组 resolver.resolve(userNames);


步骤三:实现ResolveListener

    同样,由于在网络上解析用户需要一定时间,我们使用观察者模式接收解析结果消息。这里需要实现ResolveListener接口和它的三个方法。

    首先在调用resolve()方法前增加语句:

resolver.addResolveListener(new ResolveHandler());

    然后在ResolveHandler中实现ResolveListener接口。如果解析成功,resolved()方法将会被调用。在本例中,如果解析失败或解析到多个用户,我们不作任何处理。

public class ResolveHandler ResolveListener{ private STUser stUser = null; public void resolved(ResolveEvent event) { stUser = event.getResolved(); } public void resolveConflict(ResolveEvent event) { } public void resolveFailed(ResolveEvent event) { } }

    本小节详细的代码参见示例程序AddUserDialog类。

0
相关文章