1.登陆IM
Connection.DEBUG_ENABLED = true;//首先激活调试模式
1.1建立连接
首先,在启动DSM Message时,客户端通过XMPPConnection与服务器建立连接。建立连接的方式有两种:
1.直接连到服务器
Connection conn = new XMPPConnection("localhost");//创建连接
//其中“localhost”是服务器地址,由于我用的是本机,所以是“localhost”。conn.connect();//接通连接
2.根据配置连接
ConnectionConfiguration config = ConnectionConfiguration(); config.setServiceName("localhost");//还可以设置很多其他属性,如隐身登陆Connection conn1 = new XMPPConnection(config);
conn1.connect();
1.2用户登陆
建立连接之后就是用户登陆了,openfire是支持多终端登陆的,下面的resource 就是指的是终端名称,如Smack、Spark等。登陆的方法有两个
login(String username, String password)和
login(String username, String password, String resource)
具体例子如下,livsun与livsun1是两个用户,密码都是111
conn.login("livsun", "111","Smack");
resource也可以缺省不设置
conn1.login("livsun1", "111");
本文后面默认livsun与livsun1已经登陆,且与服务器的连接分别conn和conn1.
1.3断开连接
断开连接只需调用disconnect()方法,如conn.disconnect();
2.单人聊天
2.1发起会话请求
作为一款IM软件的通信协议,首要功能就是聊天。聊天包含两种方式,主动向其他人
发起会话;也可以接受别人的会话请求。下面是主动对别人发起会话的实现:
conn.getChatManager.createChat(String userID, MessageListener listener)
其中userID是本次对话请求的接收方的标志,如UserID是livsun1@z00189374/Smack, livsun1@z00189374是对话请求的接收方,/Smack说明用户是在哪个终端登陆的,可以缺省
不写。
2.1.1消息监听
当想一个用户发起会话请求,对方接受请求并创建会话后,对方可能发送消息回来,这
时需要对接受的消息进行处理。这里要用到MessageListener。
下例将创建一个会话并对收到的消息进行输出:
Chat chat= conn.getChatManager().createChat("livsun1@z00189374/Smack",
new MessageListener(){
publicvoid processMessage(Chat chat0, Message message)
{
System.out.println("来自livsun1的消息,内容为"+message.getBody()); }
});
红色chat是这次创建的对话对象,它在livsun跟livsun1之间建立一个会话连接;同
事处理来自livsun1的消息。如果livsun想要发消息,需要用chat来调用sendMessage
方法。
具体可见下例:
chat.sendMessage("Hello,I’m livsun");
2.1.2会话请求监听
通过上面例子可以知道livsun怎样发送了一个消息给livusn1。但是livsun1需要知
道何时livsun发了一个消息给自己,同时还要对这个消息进行处理。Smack提供了会话请求
监听接口ChatManagerListener,每个用户通过实现该接口,来监听没一个会话的创建请求。
这里再以livsun1为例来展示一下:
chat.getChatManager.addChatListener(ChatManagerListener listener)
ChatManagerListener只有一个方法chatCreated(Chat chat,
boolean createdLocally),它用来处理当chat创建时的具体操作。
具体请看下面例子:
conn1.getChatManager().addChatListener(
new ChatManagerListener(){
publicvoid chatCreated(Chat chat, boolean createdLocal)
{
//自己创建是指自己调用createChat方法,它也会触发这个listener
//一半在创建对话时就会制定MessageListener,这样判断主要是为了避免重复定义
//MessageLister
if(createdLocal)
{
System.out.println("这个chat是自己创建的");
}
//创建与livsun的对话,这里面可以通过message来获取发送聊天请求的人信息
else
{
System.out.println("别人想跟我聊天");
chat.addMessageListener(new MessageListener(){
publicvoid processMessage(Chat chat, Message message)
{
System.out.println(message.getFrom+"想跟我聊天) chat.sendMessage("你好");
}
});
}
}
});
2.1.3会话状态监听
通常用户在参加一个会话时,想知道另一个用户是否正在输入。会话状态有五种:active (参加会话), composing(正在输入), gone(离开), inactive(没有参加会话), paused(暂停输入)。
如果想要对会话状态监听,需要在用户登陆之后,会话建立之前,添加ChatStateManager 对象,方法为ChatStateManager.getInstance(XPMMConnectio conn);譬如获取livsun连接的ChatStateManager代码是ChatStateManager csm = ChatStateManager(conn);
在客户端,根据用户对于一个会话的不同操作,通过ChatStateManager调用方法setCurrentState(ChatState newState, Chat chat)来设置会话的即时状态。如当livsun正在打字输入,则可以通过csm.setCurrentState(ChatState.composing, chat)来设置状态为正在输入。
在客户端,还需要对会话状态改变进行监听,ChatStateListener继承MessageListener,方法是stateChanged(Chat chat, ChatState state),由于Chat类没有直接添加ChatStateListener 的方法,因此需要自己编写一个内部类实现ChatStateListener和MessageListener两个接口。
请看例子:
private class SelfListener implements ChatStateListener, MessageListener{
public void stateChanged(Chat arg0, ChatState arg1){
……
}
Public void processMessage(Chat arg0, Message arg1){
……
}
}
MessageListener messageListener = new SelfListener();
这样当会话对方的ChatState发生改变时,stateChanged方法就被触发。实际上是接收到一个内容为空的Message,Message里通知ChatState改变。
2.2消息
2.2.1设置消息的属性
发送消息的方法sendMessage(),它有两种实现方式,sendMessage(String text) 和sendMessage(Message message)。第一种就是上面例子中所用的,直接以String为对象,发送一个消息。
为了满足用户自定义需求,Smack提供了第二种方式,它可以为message添加一些附加属性,在message中他们只显示为String字段。在客户端接收时,可以通过处理来让这些字段有特定的意义,譬如设置发送文字的大小,字体,颜色等。
这里需要了解Message这个类,它有三种构造函数,Message()、Message(String text)和Message(String text, Message.Type type)其中text是要发送的内容,Message.Type共有五种,常用的为chat和groupchat。
Message中有很多方法,通过这些方法可以设置或者取得消息的属性,如addBody()添加消息内容,getBody()获得消息内容,getFrom()获取消息的发送者等。Message还有API中没有提到的方法:setProperty(String name, String value)。通过这个方法我们可以设置很多自己定义的属性,可参见下面例子:
Message message = new Message();
message.setBody(“This is a Message text”);
message.setProperty(“color”,”red”);
message.setProperty(“size”, “big”);
message.setProperty(“isPictureIn”,”false”);
chat.sendMessage(message);
这样就发送了一个包含一些特定属性的消息。当用户收到这样的消息后,通过调用message.getPropertyNames()方法来获取所有属性的一个Collection。再通过
message.getProprety(String name)来获取名为name属性的值,根据用户自己的定义,可以实现API没有提供的功能,如改变消息显示字体颜色。
2.2.2消息状态跟踪
对于发送出去的消息,有时候需要获取消息发送的情况,如是否发送成功,对方是够处理等,这些功能需要用到MessageEventManager,通过调用
MessageEventManager.addNotificationsRequests(Message message, boolean offline,
boolean delivered, boolean displayed, boolean composing)来对消息的状态进行标记跟踪, message为将要发送的消息,剩余四项为可选择的跟踪选项,true为跟踪。
当对其中部分选项进行跟踪后,下一步操作就是对跟踪响应结果进行监控。比如你想知道自己发送消息的标记结果,需要创建一个MessageEvenetManager对象,并调用方法addMessageEventNotificationListener(MessageEventNotificationListener messageEventNotificati onListener)。
如果你想监控是否有人给自己发送消息跟踪请求,这时候需要调用方法addMessageEventRequestListener(MessageEventRequestListener messageEventRequestListener)。
2.2.3离线消息
发送消息时,用户不在线,系统会自动保存这些消息。当用户登录后,用户需要主动去服务器获取离线消息。主要用到的接口是OfflineMessageMananger。
这里有一个需要注意的地方,那就是用户login时不能发送Presence(用户状态,这个下章讲),否则收不到离线消息。
具体可以看下面例子:
ConnectionConfiguration connConfig = new ConnectionConfiguration("localhost"); connConfig.setSendPresence(false);//设置不发送Presence
Connection conn2 = new XMPPConnection(connConfig);
Conn2.connect();
Conn2.login("zhang", "111");
OfflineMessageManager omm = new OfflineMessageManager(conn2);//创建一个对象
Iteratorommlist = omm.getMessages();//获取消息,结果为一个Message迭代器omm.deleteMessages();//将服务器上的离线消息删除。
如果不执行最后一步操作的话,下次登录这些离线消息还在。
2.3文件传输
用户可能希望向其它用户发送文件。其它用户有接受,拒绝,或忽略用户的请求。Smack 为用户轻松发送文件提供了一个简单的接口。暂只实现文件传输,没有实现文件夹传输。
2.3.1发送文件
要发送或接受文件首先必须创建fileTransferManager类的一个对象,创建方法是
继续阅读