XMPP Smack 类库资料.docx

上传人:b****6 文档编号:8419164 上传时间:2023-01-31 格式:DOCX 页数:16 大小:27.62KB
下载 相关 举报
XMPP Smack 类库资料.docx_第1页
第1页 / 共16页
XMPP Smack 类库资料.docx_第2页
第2页 / 共16页
XMPP Smack 类库资料.docx_第3页
第3页 / 共16页
XMPP Smack 类库资料.docx_第4页
第4页 / 共16页
XMPP Smack 类库资料.docx_第5页
第5页 / 共16页
点击查看更多>>
下载资源
资源描述

XMPP Smack 类库资料.docx

《XMPP Smack 类库资料.docx》由会员分享,可在线阅读,更多相关《XMPP Smack 类库资料.docx(16页珍藏版)》请在冰豆网上搜索。

XMPP Smack 类库资料.docx

XMPPSmack类库资料

1.登陆IM

Connection.DEBUG_ENABLED=true;//首先激活调试模式

1.1建立连接

首先,在启动DSMMessage时,客户端通过XMPPConnection与服务器建立连接。

建立连接的方式有两种:

1.直接连到服务器

Connectionconn=newXMPPConnection("localhost");//创建连接

//其中“localhost”是服务器地址,由于我用的是本机,所以是“localhost”。

conn.connect();//接通连接

2.根据配置连接

ConnectionConfigurationconfig=ConnectionConfiguration();

config.setServiceName("localhost");//还可以设置很多其他属性,如隐身登陆

Connectionconn1=newXMPPConnection(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(StringuserID,MessageListenerlistener)

其中userID是本次对话请求的接收方的标志,如UserID是livsun1@z00189374/Smack,livsun1@z00189374是对话请求的接收方,/Smack说明用户是在哪个终端登陆的,可以缺省不写。

2.1.1消息监听

当想一个用户发起会话请求,对方接受请求并创建会话后,对方可能发送消息回来,这时需要对接受的消息进行处理。

这里要用到MessageListener。

下例将创建一个会话并对收到的消息进行输出:

Chatchat=conn.getChatManager().createChat("livsun1@z00189374/Smack",newMessageListener(){

publicvoidprocessMessage(Chatchat0,Messagemessage)

{

System.out.println("来自livsun1的消息,内容为"+message.getBody());

}

});

红色chat是这次创建的对话对象,它在livsun跟livsun1之间建立一个会话连接;同事处理来自livsun1的消息。

如果livsun想要发消息,需要用chat来调用sendMessage方法。

具体可见下例:

chat.sendMessage("Hello,I’mlivsun");

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(

newChatManagerListener(){

publicvoidchatCreated(Chatchat,booleancreatedLocal)

{

//自己创建是指自己调用createChat方法,它也会触发这个listener

//一半在创建对话时就会制定MessageListener,这样判断主要是为了避免重复定义//MessageLister

if(createdLocal)

{

System.out.println("这个chat是自己创建的");

}

//创建与livsun的对话,这里面可以通过message来获取发送聊天请求的人信息

else

{

System.out.println("别人想跟我聊天");

chat.addMessageListener(newMessageListener(){

publicvoidprocessMessage(Chatchat,Messagemessage)

{

System.out.println(message.getFrom+"想跟我聊天)

chat.sendMessage("你好");

}

});

}

}

});

2.1.3会话状态监听

通常用户在参加一个会话时,想知道另一个用户是否正在输入。

会话状态有五种:

active(参加会话),composing(正在输入),gone(离开),inactive(没有参加会话),paused(暂停输入)。

如果想要对会话状态监听,需要在用户登陆之后,会话建立之前,添加ChatStateManager对象,方法为ChatStateManager.getInstance(XPMMConnectioconn);譬如获取livsun连接的ChatStateManager代码是ChatStateManagercsm=ChatStateManager(conn);

在客户端,根据用户对于一个会话的不同操作,通过ChatStateManager调用方法setCurrentState(ChatState newState,Chat chat)来设置会话的即时状态。

如当livsun正在打字输入,则可以通过csm.setCurrentState(ChatSposing,chat)来设置状态为正在输入。

在客户端,还需要对会话状态改变进行监听,ChatStateListener继承MessageListener,

方法是stateChanged(Chat chat,ChatState state),由于Chat类没有直接添加ChatStateListener的方法,因此需要自己编写一个内部类实现ChatStateListener和MessageListener两个接口。

请看例子:

privateclassSelfListenerimplementsChatStateListener,MessageListener{

publicvoidstateChanged(Chatarg0,ChatStatearg1){

……

}

PublicvoidprocessMessage(Chatarg0,Messagearg1){

……

}

}

MessageListenermessageListener=newSelfListener();

这样当会话对方的ChatState发生改变时,stateChanged方法就被触发。

实际上是接收到一个内容为空的Message,Message里通知ChatState改变。

2.2消息

2.2.1设置消息的属性

发送消息的方法sendMessage(),它有两种实现方式,sendMessage(Stringtext)和sendMessage(Messagemessage)。

第一种就是上面例子中所用的,直接以String为对象,发送一个消息。

为了满足用户自定义需求,Smack提供了第二种方式,它可以为message添加一些附加属性,在message中他们只显示为String字段。

在客户端接收时,可以通过处理来让这些字段有特定的意义,譬如设置发送文字的大小,字体,颜色等。

这里需要了解Message这个类,它有三种构造函数,Message()、Message(Stringtext)和Message(Stringtext,Message.Typetype)其中text是要发送的内容,Message.Type共有五种,常用的为chat和groupchat。

Message中有很多方法,通过这些方法可以设置或者取得消息的属性,如addBody()添加消息内容,getBody()获得消息内容,getFrom()获取消息的发送者等。

Message还有API中没有提到的方法:

setProperty(Stringname,Stringvalue)。

通过这个方法我们可以设置很多自己定义的属性,可参见下面例子:

Messagemessage=newMessage();

message.setBody(“ThisisaMessagetext”);

message.setProperty(“color”,”red”);

message.setProperty(“size”,“big”);

message.setProperty(“isPictureIn”,”false”);

chat.sendMessage(message);

这样就发送了一个包含一些特定属性的消息。

当用户收到这样的消息后,通过调用message.getPropertyNames()方法来获取所有属性的一个Collection。

再通过message.getProprety(Stringname)来获取名为name属性的值,根据用户自己的定义,可以实现API没有提供的功能,如改变消息显示字体颜色。

2.2.2消息状态跟踪

对于发送出去的消息,有时候需要获取消息发送的情况,如是否发送成功,对方是够处理等,这些功能需要用到MessageEventManager,通过调用MessageEventManager.addNotificationsRequests(Message message,boolean offline,boolean delivered,boolean displayed,boolean composing)来对消息的状态进行标记跟踪,message为将要发送的消息,剩余四项为可选择的跟踪选项,true为跟踪。

当对其中部分选项进行跟踪后,下一步操作就是对跟踪响应结果进行监控。

比如你想知道自己发送消息的标记结果,需要创建一个MessageEvenetManager对象,并调用方法addMessageEventNotificationListener(MessageEventNotificationListener messageEventNotificationListener)。

如果你想监控是否有人给自己发送消息跟踪请求,这时候需要调用方法addMessageEventRequestListener(MessageEventRequestListener messageEventRequestListener)。

2.2.3离线消息

发送消息时,用户不在线,系统会自动保存这些消息。

当用户登录后,用户需要主动去服务器获取离线消息。

主要用到的接口是OfflineMessageMananger。

这里有一个需要注意的地方,那就是用户login时不能发送Presence(用户状态,这个下章讲),否则收不到离线消息。

具体可以看下面例子:

ConnectionConfigurationconnConfig=newConnectionConfiguration("localhost");

connConfig.setSendPresence(false);//设置不发送Presence

Connectionconn2=newXMPPConnection(connConfig);

Conn2.connect();

Conn2.login("zhang","111");

OfflineMessageManageromm=newOfflineMessageManager(conn2);//创建一个对象

Iteratorommlist=omm.getMessages();//获取消息,结果为一个Message迭代器

omm.deleteMessages();//将服务器上的离线消息删除。

如果不执行最后一步操作的话,下次登录这些离线消息还在。

2.3文件传输

用户可能希望向其它用户发送文件。

其它用户有接受,拒绝,或忽略用户的请求。

Smack为用户轻松发送文件提供了一个简单的接口。

暂只实现文件传输,没有实现文件夹传输。

2.3.1发送文件

要发送或接受文件首先必须创建FileTransferManager类的一个对象,创建方法是FileTransferManager(XMPPConnectionconnection)。

假设现在livsun创建了一个文件传输管理对象fileTransferManager=newFileTransferManager(conn);现在需要创建一个输出的文件传输对象来发送文件。

OutgoingFileTransferoutfile=fileTransferManager(UserID),UserID为完全ID,如果要发送文件给livsun1的话,这里UserID为”livsun1@z00189374/Smack”。

通过调用sendFile(file,description)来发送文件,file是文件对象,description是对文件的描述,可以在接受时获取,并提示用户,可以根据描述来选择是否接受。

一个完整的发送文件的过程如下:

FileTransferManagerfileTransferManager=newFileTransferManager(conn);

OutgoingFileTransferoutfile=

manager.createOutgoingFileTransfer("livsun1@z00189374/Smack");

outfile.sendFile(newFile("fileToBeSended.txt"),"Youwon'tbelievethis!

");

 

2.3.2接受文件

如果想知道是否有人发送文件给自己,首先同样需要创建一个FileTransferManager对象,如FileTransferManagerfileTransferManager1=newFileTransferManager(conn1);然后对该对象注册一个监听器FileTransferListener,来监听文件传输请求。

这个监听器在有文件传输时被触发,它只有一个方法fileTransferRequest(FileTransferRequestrequest),这个方法来决定文件时接受还是拒绝。

如果要拒绝接受,只要简单的request.reject()就可以了。

如果要接受,通过request.accept()创建一个IncomingFileTransfer对象,代码实现:

IncomingFileTransferinfile=request.accept();然后infile调用recieveFile(file)来讲文件接受到file中。

同时还可以对文件传输的状态进行监听。

监听及接受文件的代码实现:

finalFileTransferManagerfileTransferManager1=newFileTransferManager(conn);

fileTransferManager1.addFileTransferListener(newFileTransferListener(){

publicvoidfileTransferRequest(FileTransferRequestrequest){

//监查此请求是否应该被接受,shouldAccept由自己实现

if(shouldAccept(request)){//接受则接受文件

IncomingFileTransferinfile=request.accept();

infile.recieveFile(newFile("FILE_PATH"+infile.getName()));

}else{

request.reject();

}

}

});

 

2.3.3文件传输状态监听

在文件传输过程中,发送方活接收方需要知道文件传输的进度和状态,需要通过FileTransfer类来实现。

IncomingFileTransfer和OutgoingFileTransfer都继承了FileTransfer类,此类提供一些方法监视文件传输的进展:

getStatus()-文件传输可以有多种状态,协商,拒绝,取消,传输过程中,错误和完成。

这个方法会文件传输的当前状态。

getProgress()-如果文件在传输过程中,这个方法会返回一个0到1的数字,0表示传输还没开始,1表示传输完成。

如果没在传输过程中也可能返回-1。

isDone()-和getProgress()方法类似,不同的是它返回boolean。

如果状态为拒绝,取消,错误或完成返回真,否则返回假。

getError()-如果在传输过程中发生错误,这个方法将会返回所发生的错误的类型。

如在接收方监视文件状态,代码实现如下:

while(!

infile.isDone()){

if(infile.getStatus().equals(Status.ERROR)){

System.out.println("ERROR!

!

!

"+transfer.getError());

}else{

System.out.println(infile.getStatus());

System.out.println(infile.getProgress());

}

}

 

3.多人聊天

MultiUserChat,即多人聊天,通过一个用户创建群组,并邀请其他用户进入群组,或者其他用户可以自由进入群组,并在群组里聊天。

功能有创建房间、邀请、监听邀请或拒绝、权限更改、身份改变等。

3.1创建多人聊天房间

用户可以创建两种多人聊天房间:

即时房间和永久房间。

即时房间按照默认的设置立马生成,但是在所有参与用户下线后,该房间注销。

永久房间是创建者通过自己的设置生成,创建者是第一个参与者,并且是该房间的Owner。

要想创建一个房间,首先需要创建一个MultiUserChat的对象,MultiUserChat类的构造函数需要两个参数,当前用户的连接和房间的JID。

MultiUserChatchatRoom=newMultiUserChat(conn,“myGroup@conference.z00189374”);

通过chatRoom调用create(“nickname”)来创建房间,其中nickName为用户在房间里显示的昵称。

为了使房间成为永久房间并且更加符合用户的习惯,用户需要对房间进行一些设置。

第一步是获取房间的配置表格,代码为

Formform=chatRoom.getConfigurationForm();

再根据配置表格生成一个用来提交配置的表格,代码为

FormsubmitForm=form.createAnswerForm();

在对submifForm进行设置一些属性,属性包含但不限于以下几个:

//房间的名称

submitForm.setAnswer("muc#roomconfig_roomname","TestUserNumber");

//保证只有注册的昵称才能进入房间

submitForm.setAnswer("x-muc#roomconfig_reservednick",true);

//设置为永久房间

submitForm.setAnswer("muc#roomconfig_persistentroom",true);

//设置房间人数上限,注意,参数不是int!

submitForm.setAnswer("muc#roomconfig_maxusers",list);

最后通过chatRoom调用sendConfigurationForm(submitForm)来完成对房间的配置。

3.2加入聊天室

为了在聊天室里接受或发送消息,首先需要进入聊天室。

进入房间之前,先通过用户连接和房间JID来创建一个MultiUserChat的对象。

MultiUserChatchatRoom1=newMultiUserChat(conn1,“myGroup@conference.z00189374”);

有三种进入房间的方式:

一、直接加入不需要密码的房间chatRoom1.join(“nickname”);

二、加入需要密码的房间chatRoom1.join(“nickName”,”password”);

三、加入需要密码的房间,且同时设置接受聊天记录的数目,在一、二中,没有设置这项,接受的数目有服务器决定。

DiscussionHistoryhistory=newDiscussionHistory();

history.setMaxStanzas(5);

muc2.join("testbot2","password",history,SmackConfiguration.getPacketReplyTimeout());

3.3群组邀请及群组邀请监听

如果你建了一个群,你可能希望你的某些好友也加入到这个群,你可以通过对他们发送邀请并监听结果来实现这个功能。

首先加入一个房间,muc.join(“livsun”),并且确认你有这个房间的邀请资格。

然后通过muc调用invite(user,reason)方法,其中user是被邀请人的JID,reason是邀请原因。

为了知道邀请结果,这里只能获取对面拒绝的结果,在发出邀请之前,需要对multiuserChat对象注册一个监听器muc.addInvitationRejectionListener(newIn

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 工程科技 > 冶金矿山地质

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1