技术开发 频道

Lotus Sametime开发入门


3. Instant Messaging服务(InstantMessagingService):进行实时交谈

    现在我们已经可以获得一个用户的实例,接下来希望向一个指定用户发送/接收即时消息(Instant Message),这就需要使用Instant Messaging服务。用法是先创建一个IM对象,该对象代表了两个Client之间的一次会话,然后通过IM对象能够发送和接收消息。需要注意的是IM必须被打开以后才能使用。

步骤一: 获得InstantMessagingService对象

    首先像创建其他服务对象一样,通过STSession对象获得InstantMessagingService对象。

InstantMessagingService imService =(InstantMessagingService) session.getCompApi( InstantMessagingService.COMP_NAME);

步骤二: 打开即时消息(IM)

    打开即时消息需要使用Im类。我们首先用InstantMessagingService对象创建Im类,然后使用该类的open方法打开即时消息。

Im im = imService.createIm( stUser, EncLevel.ENC_LEVEL_NONE, ImTypes.IM_TYPE_CHAT); im.open();

步骤三: 实现Listener

    在createIm()方法中,参数stUser表示和指定的用户创建一个IM会话, encLevel表示加密级,imType表示IM的类型,常用的是ImTypes.IM_TYPE_CHAT。

    同样,我们使用观察者模式接收消息。这里需要实现两个Listener接口。

  • ImServiceListener:本接口需要和InstantMessagingService对象绑定,负责接收IM服务的事件,如其他用户向自己初次发送的IM消息。需要实现的方法有imReceived()。
  • ImListener:本接口需要和Im对象绑定,负责接收某一个特定IM服务的事件。即在一个IM创建成功后,本接口只负责接收该IM上的事件。需要实现的方法有dataReceived(),textReceived(),imOpened(),imClosed(),openImFailed()。

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

imService.addImServiceListener(new ImServiceHandler()); //该Service只接收Chat类型的消息 imService.registerImType(ImTypes.IM_TYPE_CHAT) im.addImListener(new ImHandler());

    然后分别实现这两个Listener接口。

ImServiceListener的实现如下: public class ImServiceHandler implements ImServiceListener { public void imReceived(ImEvent e) { Im im = e.getIm(); partner = im.getPartner(); im.addImListener(new ImHandler()); } }

    假设用户A希望向用户B发送消息,他创建了一个Im对象,添加了ImHandler,然后调用open()方法打开了它,那么在用户B处imReceived()方法就会被触发,用户B在接收到一个用户A创建的IM后,也需要为这个IM添加一个ImHandler对象,以便进行消息的处理

    ImListener的实现如下:

public class ImHandler implements ImListener { public void openImFailed(ImEvent e) { System.out.println("Im Opene failed,reason:"+e.getReason()); } public void imOpened(ImEvent e) { System.out.println("Im Opened, send text.."); // 发送消息,false 表示该消息不用加密 e.getIm().sendText(false, "This is a test"); } public void imClosed(ImEvent e) { System.out.println("Im closed"); } public void textReceived(ImEvent e) { System.out.println("Message received :"+ e.getText()); } public void dataReceived(ImEvent e) { //接收到对方发送的二进制数据 System.out.println("Data received :"+ e.getData()); } }

    可以看出,ImHandler能够对多个事件进行响应,常用到的两个方法是:

1.imOpened():它表示IM已经打开成功,可以发送/接收消息了,在我们的例子中立刻调用了IM的sendText方法发送了一个简单的消息。

2.textReceived():它利用ImEvent参数能够取得对方发送过来的消息。

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

4. Places服务(PlacesService):在虚拟空间中进行协作

    Place在Sametime toolkit中是非常重要的结构,它作为一个虚拟的空间,多个用户可以在其中进行协作,在应用程序中使用一个字符串名称和类型来标志Place。Place中包括三类成员:User, Section和Activity。

  • User: 代表了进入到Place中的一个用户
  • Section: 一个Place包含多个Sections, 可以认为是Place中的"Place"。其中第一个Section 比较特殊,叫做"Stage",它有些特殊的权限,比如可以向整个Place发送消息。一旦用户进入到Place,就自动了进入了Stage。 当然用户可以也转移到其他Section去。
  • Activity: 表示多个用户在一起进行协作的活动,例如应用程序共享。多个在线用户之间可以共享、操作某一个用户机器上正在运行的程序。

关于Place的另一个基本概念是Place Member。User,Section,Activity甚至Place本身都是Place Member,下面是它们之间的关系图。

图5:Sametime place模型
图5:Sametime place模型

    Place Member定义的接口允许成员之间通过发送消息/数据的方式进行通信。但是对不同的Place Member调用sendText()方法,接收者的范围(Scope)有所不同。例如place.sendText() 会导致Place中的所有成员都会接收到消息,而section.sendText()则把范围限定到一个特定Section中。

    在我们的例子STClient中,Place会作为一个桌面共享的空间,这一小节只介绍如何进入Place, 其他操作在读者能在Application Share服务一节中看到。

步骤一:获得Place Service

    首先像创建其他服务对象一样,通过STSession对象获得PlacesService对象。


placeService = (PlacesService) session.getCompApi(PlacesService.COMP_NAME);
步骤二:创建并进入Place
place = this.placeService.createPlace( "sample place", // Place的唯一名称 "sample place", // Place对外的显示名称 EncLevel.ENC_LEVEL_NONE, // 加密级别 0); // Place的类型 place.enter();

步骤三:实现Listener

    我们仍然使用观察者模式接收消息。虽然可以实现PlaceListener接口来接收消息,但toolkit中提供了更加方便使用的PlaceAdapter类。因为它已经实现了全部PlaceListener接口,我们只需继承它并重载需要改变的方法即可。

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

place.addPlaceListener(new PlaceHandler());

    然后在PlaceHandler中重载PlaceAdapter的方法。作为例子,这里我们只重载entered()方法。

public class PlacesHandler extends PlaceAdapter { // 用户进入place中以后,该方法会被调用 public void entered(PlaceEvent event) { System.out.println("Place entered"); } }

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

0
相关文章