`

一个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  
多谢,学下了

相关推荐

    Smack API手册与文档

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

    Smack API中文版

    这个是Smack API的中文版,详细介绍了smack原理,并且有几个小例子在里面

    Smack中文文档,chm格式

    Smack中文文档Smack中文文档Smack中文文档Smack中文文档Smack中文文档Smack中文文档Smack中文文档Smack中文文档Smack中文文档Smack中文文档

    smack4.10含源码

    Smack是一个开源,易于使用的XMPP(jabber)客户端类库。 附件是目前最新版本的smack库,含源码。

    smack4.3.1

    smack用于android移动端的开发,可以结合openfire使用,进行im通信

    Smack帮助文档中文版

    Smack帮助文档中文版:XMPP协议包括一个基本协议和许多可选扩充,像具有代表性的"JEP's".Smack 为核心XMPP协议提供了org.jivesoftware.smack包,为许多协议扩充提供了org.jivesoftware.smackx包.

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

    游客与spark聊天:用的是smack+spark+openfier 本想做个web在线客服的

    Smack中文API文档

    Smack中文API文档

    smack 源码

    smack源码

    android Smack教程一:实例代码

    这一节中我们着力介绍如何基于asmack开发一个Android的客户端,本篇的重点在实践,讲解和原理环节,大家可以参考前面我所发布的OpenFire和Smack的相关文章。今天所讲解的文章只是 :基于Smack3.0.4+ Openfire3.10.2...

    smack-4.3.4.zip

    Smack API, 是一个 Java 的XMPP Client Library,也是由Jive Software开发。 优点:。 缺点:API并非为大量并发用户设计,每个客户要1个线程,占用资源大,1台机器只能模拟有限(数千个)客户. smack是一个用 java 写的...

    SMACK文件传输

    SMACK文件传输的介绍及代码,官网源文件

    smack api帮助文档

    smack api帮助文档官方提供的帮助工具

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

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

    smack 3.2.2

    smack xmpp 3.2.2 for linux

    smack源码下载(java版)

    smack源码下载,java版下载,smack源码下载

    smack4.1.4 android 测试通过

    最新的 smack4.1.4 android开发demo 可以登录 已验证

    smack3.3.1源代码

    smack3.3.1源码 open fire开源的聊天服务器。客户端的核心xmpp协议的操作。

    smack jar 文件

    Smack是一个开源,易于使用的XMPP(jabber)客户端类库。 Smack API, 是一个 Java 的XMPP Client Library,也是由Jive Software开发。 优点:编程简单。 缺点:API并非为大量并发用户设计,每个客户要1个线程,占用资源大...

    openfire+spark+smack

    Openfire+spark+smack xmpp

Global site tag (gtag.js) - Google Analytics