smark和openfire即时通信代码.docx
- 文档编号:2902306
- 上传时间:2022-11-16
- 格式:DOCX
- 页数:18
- 大小:22.10KB
smark和openfire即时通信代码.docx
《smark和openfire即时通信代码.docx》由会员分享,可在线阅读,更多相关《smark和openfire即时通信代码.docx(18页珍藏版)》请在冰豆网上搜索。
smark和openfire即时通信代码
smark和openfire即时通信代码
出自:
服务器:
openfire
客户端程序:
smark编写
首先安装openfire,下载客户端后直接安装即可,数据库可以用openfire自身的,也可以用自己的数据库,只要按提示设置好参数即可
之后,就可以用smark写一个客户端测试与openfire的通信了(需要引进的jar包除了smark自身的,还要引入xmlpull-1.1.3.1.jar、kxml2-2.3.0.jar两个包
,作用是解析xml文件)
备注:
我用的smark版本是4.0,要引入的基本包有smack-core-4.0.0.jar、smack-debug-4.0.0.jar、smack-extensions-4.0.0.jar、smack-tcp-4.0.0.jar
debug包使用来调试的,tcp是用来初始化连接的、extension包里面含有发送离线消息、文件等类
下面是创建一个连接[java]viewplaincopyConnectionConfigurationconfig=newConnectionConfiguration("ip",5222);
//设置成disabled,则不会去验证服务器证书是否有效,默认为enabled
config.setSecurityMode(SecurityMode.disabled);
//设置可以调试,默认为false,老版本的写法为XMPPConnection.DEBUG_ENABLED=true;
config.setDebuggerEnabled(true);
//设置是否在登陆的时候告诉服务器,默认为true
config.setSendPresence(false);
//XMPPConnection在后来的版本中改成了抽象类
XMPPConnectionconn=newXMPPTCPConnection(config);
//设置等待时间
conn.setPacketReplyTimeout(5000);
conn.connect();
//用户名,密码,资源名(例如:
如果是用潘迪安发送的消息,则资源名就是:
潘迪安,用于标识客户端)
conn.login("admin","0","资源名");
关于连接的参数,在新版本中全部在config中设置
发送消息[html]viewplaincopyprivatevoidtestSendMessage(XMPPConnectionconn)throwsException{
//jid在数据表中ofroster可以查到,一般是用户名@服务器名称
Chatchat=ChatManager.getInstanceFor(conn).createChat("ly@192.168.1.100",newMessageListener(){
@Override
publicvoidprocessMessage(Chatchat,Messagemessage){
System.out.println("Receivedmessage:
"+message);
}
});
Messagemsg=newMessage();
msg.setBody("helloworld");
//定义成normal,在对象不在线时发送离线消息,消息存放在数据表ofoffline中
msg.setType(Message.Type.normal);
//发送消息,参数可以是字符串,也可以是message对象
chat.sendMessage(msg);
//发送广播
conn.sendPacket(msg);
}发送离线消息[java]viewplaincopyprivatevoidtestOffLine(XMPPConnectionconn)throwsException{
//离线文件
OfflineMessageManageroffMM=newOfflineMessageManager(conn);
System.out.println("离线文件数量:
"+offMM.getMessageCount());
System.out.println("离线文件内容:
");
//经测试,当调用getMessages时,会触发chat设置的监听器,从而输出离线消息内容,但是getMessages方法返回的离线消息为空
//猜测回调函数的触发条件是一个变量,方变量改变时(while(flag)),执行回调函数
List<Message>listMessage=offMM.getMessages();
//listMessage的大小为0
System.out.println(listMessage.size());
for(Messagem:
offMM.getMessages()){
System.out.println("离线:
"+m.getBody()+m.getBodies());
}
}得到好友列表[java]viewplaincopyprivatevoidtestGetRoster(XMPPConnectionconn)throwsException{
//得到该user的roster(相当于好友列表),不区分是否在线
Rosterr=conn.getRoster();
Collection<RosterEntry>c=r.getEntries();
for(RosterEntryre:
c){
StringBuildersb=newStringBuilder();
sb.append("name:
").append(re.getName());
sb.append("\nuser:
").append(re.getUser());
sb.append("\ntype:
").append(re.getType());
sb.append("\nstatus:
").append(re.getStatus());
System.out.println(sb.toString());
System.out.println("-----------------------------");
}
System.out.println(r.getEntries());
//输出内容
/*name:
null
user:
ly@192.168.1.100
type:
from
status:
null
-----------------------------
name:
null
user:
yy@192.168.1.100
type:
to
status:
null
-----------------------------
[ly@192.168.1.100,yy@192.168.1.100]
*/
}管理好友,监听好友请求[java]viewplaincopy<prename="code"class="java">[java]viewplaincopy</pre><prename="code"class="java">privatevoidtestAddAndDelFriends(finalXMPPConnectionconn)throwsException{
Rosterr=conn.getRoster();
//用户的jid,昵称,用户的分组。
如果该用户不存在也可以添加
//r.createEntry("yy@192.168.1.100","yy",null);
//rosterEntry的构造方法是包访问权限,不能直接new
//RosterEntryentry=r.getEntry("ly@192.168.1.100");
//r.removeEntry(entry);
//监听所有的请求,之后可以过滤掉不想要的请求
PacketListenerpacketListener=newPacketListener(){
@Override
publicvoidprocessPacket(Packetpacket)throwsNotConnectedException{
/*
available
unavailable
subscribe发出添加好友的请求
subscribed同意添加好友
unsubscribe发出删除好友请求
unsubscribed删除好友(即拒绝添加好友),
备注:
对方发出添加好友的请求后,在服务器端会自动把对方加入到自己的roster,所以在执行处理好友请求或添加删除好友的时候,要重新获取roster,更新好友列表
*/
Presencepresence=(Presence)packet;
Typetype=presence.getType();
//请求添加好友
if(Type.subscribe.equals(type)){
//注意点:
要设置to(即指明要发送的对象,否则不能成功拒绝),至于from不用设置,因为在sendPacket方法中已经设置了,formMode初始化的时候为OMITTED,可以自己设置
/*
switch(fromMode){
caseOMITTED:
packet.setFrom(null);
break;
caseUSER:
packet.setFrom(getUser());//getUser是抽象方法
break;
*/
//直接用传来的presence,不能自己新建一个presence(可能要验证presence是否是原来的对象,来判断是谁拒绝了谁的好友请求),否则不能成功拒绝对方添加好友
//例:
A--presence1-->BA---presence2---C,C---presence3---A这样服务器就没办法判断是B、C中的哪一个拒绝了A的请求
presence.setType(Type.unsubscribed);//拒绝,发送了一条presence
//presence.setType(Type.unavailable);//发送了两条presence,一条是subscribed,一条是unavailabled,能接受对方消息,自己的状态显示隐身,再一次登录的时候显示在线
presence.setTo(presence.getFrom());
presence.setPacketID(presence.getPacketID());
Rosterr=conn.getRoster();
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- smark openfire 即时 通信 代码