`

一个opoenfire与smack的例子

阅读更多
假设openfire是开着的,这样下面两个类才可以跑起来
(附件包含了Smack帮助文档中文版和需要的jar包)

import java.util.Collection;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;

import org.jivesoftware.smack.Roster;
import org.jivesoftware.smack.RosterEntry;
import org.jivesoftware.smack.RosterListener;
import org.jivesoftware.smack.XMPPConnection;
import org.jivesoftware.smack.packet.Presence;

public class OpenFireUser {
	
	private XMPPConnection connection=new OpenFireConnection().getConnection();
	public String serverName="@"+connection.getServiceName();
	private String username = "";
	private String password = "";
	
	Roster roster ;
	Presence presence = new Presence(Presence.Type.subscribe);
	
	public OpenFireUser() {
	}
	
	public OpenFireUser(String username, String password) {
		super();
		this.username = username;
		this.password = password;
	}
	
	
	public boolean create() {//创建用户
		boolean b=true;
		try {
			connection.getAccountManager().createAccount(this.username, this.password);
			
		} catch (Exception e) {
			b=false;
		}
		return b;
	}
	
	public boolean create(Map m) {//创建用户
		boolean b=true;
		try {
			connection.getAccountManager().createAccount(this.username, this.password,m);
		} catch (Exception e) {
			b=false;
		}
		return b;
	}
	public boolean delete() {//删除用户
		boolean b=true;
		try {
			connection.getAccountManager().deleteAccount();
		} catch (Exception e) {
			b=false;
		}
		return b;
	}
	
	public boolean login() {//登陆
		
		boolean b=true;
		try {
			connection.login(this.username, this.password);
			roster = connection.getRoster();
			roster.addRosterListener(new RosterListener(){//监听Roster

				@Override
				public void entriesAdded(Collection<String> collection) {//添加好友的时候触发
					String user = "";
					Iterator<String> it = collection.iterator();
					if(it.hasNext()){
						user=it.next()+serverName;
					}
					
					//订阅好友的Presence
					Presence presence = new Presence(Presence.Type.subscribe); 
					presence.setTo(user);
					//presence.setMode(Presence.Mode.available); 
					connection.sendPacket(presence);
					
				}

				@Override
				public void entriesDeleted(Collection<String> arg0) {}

				@Override
				public void entriesUpdated(Collection<String> arg0) {}

				@Override
				public void presenceChanged(Presence p) {
					//当订阅的好友presence改变的时候调用
					//System.out.println("Presence changed: " + p.getFrom());
				}
				
			});
		
		} catch (Exception e) {
			b=false;
		}
		return b;
	}
	public boolean addFriends(String user) {
		return addFriends(user+serverName,"");
	}
	public boolean addFriends(String user,String nickname) {
		return addFriends(user, nickname,new String[]{"Firends"});
	}
	
	//添加一个好友,添加到Firends组上
	public boolean addFriends(String user,String nickname,String[] s) {
		boolean b=true;
		roster.setSubscriptionMode(Roster.SubscriptionMode.accept_all);
		try {
			roster.createEntry(user,nickname,s);
		} catch (Exception e) {
			b=false;
		}
		return b;
	}
	
	
	public HashMap getFriends() {//获得好友
		return getFriends("");
	}
	public HashMap getFriends(String s) {//获得好友
		HashMap hm=new HashMap();
		Collection<RosterEntry> m=roster.getEntries();
		for(Iterator<RosterEntry> i=m.iterator();i.hasNext();){
			RosterEntry re= i.next();
			System.out.println("name:"+re.getName());//打印好友信息
			System.out.println("user:"+re.getUser());
			
		}

		return hm;
	}
	
	public boolean deleteFriend(String friendName){//删除某个好友
		boolean b=true;
		//roster=connection.getRoster();
		try {
			roster.removeEntry(roster.getEntry(friendName));
		} catch (Exception e) {
			b=false;
		}
		return b;
	}
	

	public void testPresences(String name){//看JID为name好友在不在线
		
		System.out.println(roster.getPresence(name));
	}
	
	public String getUsername() {
		return username;
	}

	public void setUsername(String username) {
		this.username = username;
	}

	public String getPassword() {
		return password;
	}

	public void setPassword(String password) {
		this.password = password;
	}
	
	public static void main(String[] args) {
		
		OpenFireUser test2=new OpenFireUser("test2","test2");		
		OpenFireUser test1=new OpenFireUser("test1","test1");
		//ofu.create();//创建test1用户
		//ofu2.create();//创建test2用户
		
		test1.login();
		test2.login();
		
		try{
			Thread.sleep(1000);
		}catch (Exception e) {
			// TODO: handle exception
		}
		
		System.out.println("*******************test1**********************");
		//test1.addFriends("test2");//test1添加test2为好友,组为Friends
		//test1.testPresences();
		//test1.getFriends();//这里可以打印出好友
		try{
			//Thread.sleep(1000);
		}catch (Exception e) {
			// TODO: handle exception
		}
		System.out.println("*******************test2**********************");
		//test2.getFriends();//这里可以打印出好友
		//test2.addFriends("test1");
		try{
			//Thread.sleep(1000);
		}catch (Exception e) {
			// TODO: handle exception
		}
		test2.testPresences("test1@rd-test-1");//这里可以打印出好友是否在线
		test1.testPresences("test2@rd-test-1");
		
		try {
			Thread.sleep(10000);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		
	}

}



import org.jivesoftware.smack.ConnectionConfiguration;
import org.jivesoftware.smack.XMPPConnection;
import org.jivesoftware.smack.XMPPException;
//这类只是连接openfire服务器,其他什么都不做
public class OpenFireConnection {
	
	String openFireServ="localhost";//openfire服务器这是在本机上,不然就是openfire服务器的IP地址
	
	public OpenFireConnection() {
		super();
	}
	
	public OpenFireConnection(String openFireServ) {
		super();
		this.openFireServ = openFireServ;
	}
	
	public XMPPConnection getConnection() {
		ConnectionConfiguration config = new ConnectionConfiguration(openFireServ, 5222);   
	    XMPPConnection conn = null;   
	    try {
	    	conn=new XMPPConnection(config);
			conn.connect();
		} catch (XMPPException e) {
			e.printStackTrace();
		}
		return conn;
	}
	
	public String getOpenFireServ() {
		return openFireServ;
	}

	public void setOpenFireServ(String openFireServ) {
		this.openFireServ = openFireServ;
	}
}

分享到:
评论
3 楼 jxausea 2012-12-24  
java.io.IOException: Keystore was tampered with, or password was incorrect
at sun.security.provider.JavaKeyStore.engineLoad(JavaKeyStore.java:771)
at sun.security.provider.JavaKeyStore$JKS.engineLoad(JavaKeyStore.java:38)
at java.security.KeyStore.load(KeyStore.java:1185)
at org.jivesoftware.smack.ServerTrustManager.<init>(ServerTrustManager.java:63)
at org.jivesoftware.smack.XMPPConnection.proceedTLSReceived(XMPPConnection.java:1246)
at org.jivesoftware.smack.PacketReader.parsePackets(PacketReader.java:313)
at org.jivesoftware.smack.PacketReader.access$000(PacketReader.java:44)
at org.jivesoftware.smack.PacketReader$1.run(PacketReader.java:76)
Caused by: java.security.UnrecoverableKeyException: Password verification failed
at sun.security.provider.JavaKeyStore.engineLoad(JavaKeyStore.java:769)
... 7 more
java.io.IOException: Keystore was tampered with, or password was incorrect
at sun.security.provider.JavaKeyStore.engineLoad(JavaKeyStore.java:771)
at sun.security.provider.JavaKeyStore$JKS.engineLoad(JavaKeyStore.java:38)
at java.security.KeyStore.load(KeyStore.java:1185)
at org.jivesoftware.smack.ServerTrustManager.<init>(ServerTrustManager.java:63)
at org.jivesoftware.smack.XMPPConnection.proceedTLSReceived(XMPPConnection.java:1246)
at org.jivesoftware.smack.PacketReader.parsePackets(PacketReader.java:313)
at org.jivesoftware.smack.PacketReader.access$000(PacketReader.java:44)
at org.jivesoftware.smack.PacketReader$1.run(PacketReader.java:76)
Caused by: java.security.UnrecoverableKeyException: Password verification failed
at sun.security.provider.JavaKeyStore.engineLoad(JavaKeyStore.java:769)
... 7 more
*******************test1**********************
*******************test2**********************
Exception in thread "main" java.lang.NullPointerException
at com.bizmate.smack.OpenFireUser.testPresences(OpenFireUser.java:156)
at com.bizmate.smack.OpenFireUser.main(OpenFireUser.java:208)
2 楼 517913840 2012-12-16  
请问 为什么我用roster.getPresence取用户的在线状态  返回的isvaliable都是false呢 openfire后台显示那人是在线的啊
1 楼 lishujuncat 2011-10-13  
多谢,学下了

相关推荐

    游客与spark获天smack+spark_上一个版本没有传src sorry

    Openfire是另一个与Spark和Smack紧密关联的组件,它是一个用Java编写的开源XMPP服务器。Openfire提供了一个强大的后台服务,支持大规模的实时通信,包括聊天、协作和推送通知。通过Openfire,Spark客户端可以轻松地...

    smack4.1.4 android 测试通过

    Smack 是一个开源的即时通讯库,主要用于实现XMPP(Extensible Messaging and Presence Protocol)协议。在Android平台上,开发者常使用Smack来构建聊天应用程序,因为它提供了丰富的API和功能,可以方便地创建...

    基于smack连接openfire服务器的例子-JAVA

    本文将深入探讨如何使用Smack库,一个Java实现的XMPP客户端库,来连接到Openfire服务器并进行交互。Smack简化了与XMPP服务器的通信,提供了丰富的API来处理用户认证、会话管理、消息发送和接收、以及用户状态等。 ...

    smack4.3.1

    Smack 是一个开源的、跨平台的即时通讯(IM)库,专为实现XMPP(Extensible Messaging and Presence Protocol)协议而设计。在Smack 4.3.1版本中,开发者能够利用这个强大的框架为Android移动端构建高效、安全的聊天...

    Smack API手册与文档

    1)smack api,基于smack官方javadoc制作而成,格式chm,语言english; 2)smack documentation,内容包括Overview,Getting Started Guide等等,格式chm,语言为中文(感谢fhqdddddd的奉献,本文档基于...

    Smack文档中文版

    10. **实战案例**:结合实际项目,如创建一个简单的聊天应用,将理论知识与实践相结合,能更好地掌握Smack的使用。 通过阅读《Smack文档中文版》,我们可以全面掌握Smack的使用,从而在XMPP平台上开发出功能丰富、...

    smack_接收文件实例

    Smack是一个开源的Java库,专门用于实现XMPP(Extensible Messaging and Presence Protocol)协议,这是一种基于XML的即时通讯协议,广泛应用于聊天、文件传输、实时通信等多种场景。在这个"smack_接收文件实例"中,...

    smack包.zip

    "smack包.zip"就是这样一个工具包,它提供了在Android设备上实现XMPP(Extensible Messaging and Presence Protocol)协议的功能,从而让我们能够在基于Openfire服务器的环境中搭建起即时通讯系统。 XMPP是一种开放...

    smack类库详细介绍,【中文】

    Smack是一个开源的Java库,专门用于实现XMPP(Extensible Messaging and Presence Protocol)协议,这是一种基于XML的即时通讯协议。XMPP广泛应用于聊天、协作、物联网设备通信等多个领域。在本文中,我们将深入探讨...

    openfire+smack即时通讯

    Openfire是一款开源的、基于XMPP(Extensible Messaging and Presence Protocol)协议的即时通讯服务器,而Smack是Java平台上的一个XMPP客户端库,用于实现与Openfire服务器的通信。 【描述】中的关键知识点包括: ...

    基于xmpp_openfire_smack开发之smack类库介绍和使用

    Openfire 是一个流行的 XMPP 服务器,而 Smack 则是与 Openfire 交互的客户端库。 在 Smack 中,`XMPPConnection` 是核心类,负责建立和管理到 Openfire 服务器的连接。`ConnectionConfiguration` 类用于配置连接...

    Android使用smack连接ejabberd服务器注册、收发消息

    ejabberd是一个开源的XMPP服务器,它提供了稳定、安全且可扩展的服务,支持多种编程语言的客户端接口。Smack是Java和Android平台上常用的XMPP客户端库,它提供了丰富的API,使得开发者可以轻松地构建XMPP应用。 **...

    smack api帮助文档

    Smack API 是一个开源的Java库,专门用于处理XMPP(可扩展消息处理推送协议)通信。这个API为开发者提供了一套丰富的接口和类,使得构建XMPP客户端应用程序变得简单而高效。它允许用户实现即时通讯(IM)、多用户...

    smack 3.2.2

    Smack 3.2.2 是一个专门针对Linux平台的XMPP(Extensible Messaging and Presence Protocol)库。XMPP是一种开放标准的即时通讯协议,它允许用户进行实时、双向通信,广泛应用于聊天应用、协作工具以及物联网设备...

    XMPP Smack java 聊天程序

    Smack是XMPP的一个Java实现库,它为开发者提供了简单易用的API,方便构建XMPP应用。 在"XMPP Smack java 聊天程序"这个项目中,你将学习到如何使用Smack库在Java环境中创建一个基本的聊天应用。首先,你需要理解...

    smack android

    Smack是一个开源的XMPP(eXtensible Messaging and Presence Protocol)库,广泛用于实现即时通讯和在线状态功能。在Android平台上,以往开发者通常需要使用Asmack,一个专门为Android优化的Smack版本,因为原版...

    smack_3_3_0

    Smack是一个开源的XMPP(eXtensible Messaging and Presence Protocol)库,广泛用于实现即时通讯(IM)和在线状态服务。在Android平台上,开发者可以使用Smack与Openfire服务器进行交互,创建实时通信应用程序。...

    smack4.1.5依赖jar包以及demo

    Smack是一个开源的Java库,专门用于实现XMPP(可扩展消息传递和 Presence 协议),这是一种基于XML的协议,广泛用于即时通讯和在线状态管理。Smack4.1.5是该库的一个版本,提供了丰富的API来创建XMPP客户端、服务器...

    smack与asmack的区别(包名对比解析)

    Smack的目标是提供一个稳定可靠、易于使用的XMPP客户端实现,使得开发者能够快速地构建出功能强大的IM应用。 ##### 主要特点: 1. **广泛的兼容性**:Smack支持从Java SE到Android的各种Java运行环境,适用于不同的...

Global site tag (gtag.js) - Google Analytics