smack jar下载地址 http://www.igniterealtime.org/downloads/download-landing.jsp?file=smack/smack_3_2_2.zip

由于项目需要,开始搞即时通讯相关技术,最后敲定openfire+smack实现,保留部分测试代码,留作参考:

import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
import java.util.List; import org.jivesoftware.smack.Connection;
import org.jivesoftware.smack.ConnectionConfiguration;
import org.jivesoftware.smack.Roster;
import org.jivesoftware.smack.RosterEntry;
import org.jivesoftware.smack.RosterGroup;
import org.jivesoftware.smack.XMPPConnection;
import org.jivesoftware.smack.XMPPException;
import org.jivesoftware.smack.packet.Presence;
import org.jivesoftware.smackx.Form;
import org.jivesoftware.smackx.ReportedData;
import org.jivesoftware.smackx.ReportedData.Row;
import org.jivesoftware.smackx.search.UserSearchManager; /**
* 即时通讯帮助类
* @作者 : hyw
* @描述 : TODO
* @创建时间 : 2014-8-20 上午9:49:53
* @修改时间 : 2014-8-20 上午9:49:53
* @version : 1.0
*/
public class ChatHelper {
/**
* 初始Smack对openfire服务器链接的基本配置
* @方法名称: init
* @描述: TODO
*/
public static Connection getConnection(String chatServerAddress,Integer port) {
Connection connection = null; try {
/** 5222是openfire服务器默认的通信端口,你可以登录http://192.168.8.32:9090/到管理员控制台查看客户端到服务器端口 */
ConnectionConfiguration config = new ConnectionConfiguration(chatServerAddress, port); /** 是否启用压缩 */
config.setCompressionEnabled(true);
/** 是否启用安全验证 */
config.setSASLAuthenticationEnabled(true);
/** 是否启用调试 */
config.setDebuggerEnabled(false);
//config.setReconnectionAllowed(true);
//config.setRosterLoadedAtLogin(true); /** 创建connection链接 */
connection = new XMPPConnection(config);
/** 建立连接 */
connection.connect();
} catch (XMPPException e) {
e.printStackTrace();
} return connection;
} //添加用户组
public static void createGroup(Connection connection, String groupName){
Roster roster = connection.getRoster();
RosterGroup rosterGroup = roster.createGroup(groupName);
} //更新用户组
public static boolean updateGroup(Connection connection, String oldGroupName,String newGroupName) {
try {
Roster roster = connection.getRoster();
RosterGroup rosterGroup = roster.getGroup(oldGroupName); //获取该组下所有用户
Collection<RosterEntry> entrys = rosterGroup.getEntries(); rosterGroup.setName(newGroupName);
String[] groups = new String[] { newGroupName };
if (rosterGroup != null) {
try {
Iterator<RosterEntry> it = entrys.iterator();
while (it.hasNext()) {
RosterEntry rosterEntry = (RosterEntry) it.next();
roster.createEntry(rosterEntry.getUser(), rosterEntry.getName(), groups); }
} catch (XMPPException e) {
e.printStackTrace();
} } return true;
} catch (Exception e) {
e.printStackTrace();
return false;
}
} //向用户组添加用户
public static void addUserInGroup(Connection connection,String groupName,String userId,String nickName){ Roster roster = connection.getRoster();
String[] groups = new String[] { groupName };
try {
roster.createEntry(userId, nickName, groups);
} catch (XMPPException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
RosterGroup rosterGroup = roster.getGroup(groupName);
Collection entrys = rosterGroup.getEntries();
if (rosterGroup != null) {
try {
Iterator it = entrys.iterator();
while (it.hasNext()) {
RosterEntry rosterEntry = (RosterEntry) it.next();
rosterGroup.addEntry(rosterEntry);
}
} catch (XMPPException e) {
e.printStackTrace();
} }
} /**
* 删除一个好友
* @param roster
* @param userName
* @return
*/
public static boolean removeUser(Connection connection,String userName){
Roster roster = connection.getRoster();
try { if(userName.contains("@"))
{
userName = userName.split("@")[0];
}
RosterEntry entry = roster.getEntry(userName);
System.out.println("删除好友:"+userName);
System.out.println("User: "+(roster.getEntry(userName) == null));
roster.removeEntry(entry); return true;
} catch (Exception e) {
e.printStackTrace();
return false;
} } //用户登录
public static boolean login(Connection connection,String username, String password ){ boolean loginResult = true; try {
connection.login(username, password);
} catch (XMPPException e) {
loginResult = false;
e.printStackTrace();
}
return loginResult;
} //按用户名,查询用户
public static void searchUsers(Connection connection,String serverDomain,String userName) throws XMPPException
{
UserSearchManager usm = new UserSearchManager(connection);
Form searchForm = usm.getSearchForm(serverDomain);
Form answerForm = searchForm.createAnswerForm();
answerForm.setAnswer("Username", true);
answerForm.setAnswer("search", userName);
ReportedData data = usm.getSearchResults(answerForm, serverDomain); Iterator<Row> it = data.getRows();
Row row = null;
while(it.hasNext())
{
row = it.next();
System.out.println(row.getValues("Username").next());
System.out.println(row.getValues("Name").next());
System.out.println(row.getValues("Email").next());
//若存在,则有返回,UserName一定非空,其他两个若是有设,一定非空
}
} /**
* 返回所有组信息 <RosterGroup>
*
* @return List(RosterGroup)
*/
public static void getGroups(Connection connection) {
Roster roster = connection.getRoster();
Collection<RosterGroup> rosterGroup = roster.getGroups();
Iterator<RosterGroup> i = rosterGroup.iterator();
while (i.hasNext())
System.out.println(i.next().getName());
} //获取所有好友
public static void getAllEntries(Connection connection) {
Roster roster = connection.getRoster();
Collection<RosterEntry> rosterEntry = roster.getEntries();
Iterator<RosterEntry> i = rosterEntry.iterator();
while (i.hasNext()) {
RosterEntry rosterEntity = i.next();
System.out.println(rosterEntity.getUser());
System.out.println(rosterEntity.getName());
System.out.println(rosterEntity.getStatus());
System.out.println(rosterEntity.getType());
}
} //获取我的好友树
public static void getGroupTree(Connection connection) {
System.out.println("好友树列表");
Roster roster = connection.getRoster();
Collection<RosterGroup> entriesGroup = roster.getGroups();
for (RosterGroup group : entriesGroup) {
Collection<RosterEntry> entries = group.getEntries();
System.out.println(group.getName());
for (RosterEntry entry : entries) {
System.out.println(entry.getUser());
System.out.println(roster.getPresence(entry.getUser()));
Presence presence = roster.getPresence(entry.getUser());
System.out.println("状态:" + presence.getStatus());
System.out.println("name: " + entry.getName());
}
}
} // 获取未分组好友
public static void getUnFriendsContanct(Connection connection) {
Collection<RosterEntry> rosterPerson = connection.getRoster()
.getUnfiledEntries();
System.out.println("获取未分组好友:=======================");
for (RosterEntry rosterEntry : rosterPerson) {
System.out.println("name: " + rosterEntry.getName() + ",jid: "
+ rosterEntry.getUser());
}
} //获取在线用户
public static void getOnlineUser(Connection connection) {
try {
Roster roster = connection.getRoster();
Collection<RosterEntry> entries = roster.getEntries();
if (entries!=null) {
for (RosterEntry entry : entries) {
// 获取好友状态
Presence presence = roster.getPresence(entry.getUser());
if (presence.isAvailable() == true) {
System.out.println(presence.getStatus());
System.out.println(entry.getUser());
System.out.println(entry.getName());
}
}
}
} catch (Exception e) {
e.printStackTrace();
}
} public static void main(String[] args) { Connection connection;
/** openfire服务器address */
String chatServerAddress = "192.168.1.234";
connection = ChatHelper.getConnection(chatServerAddress, 5222);
login(connection,"hyw","admin"); //创建组
//ChatHelper.createGroup(connection, "myGroup"); //向组内添加用户
// ChatHelper.addUserInGroup(connection,"myGroup","wlh@192.168.1.234/Smack","凌辉"); //更新组名称
//ChatHelper.updateGroup(connection, "myGroup", "testGroup"); //获取用户所有分组
//ChatHelper.getGroups(connection); //获取所有好友
//ChatHelper.getAllEntries(connection); //获取我的好友列表树
//ChatHelper.getGroupTree(connection); //查询好友
try {
ChatHelper.searchUsers(connection, chatServerAddress, "wlh");
} catch (XMPPException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} } }

  

openfire+smack 实现即时通讯基本框架的更多相关文章

  1. openfire+spark+smack实现即时通讯

    近公司项目需要用到即时通讯功能,经过调研发现openfire+spark+smack可以实现.在网上找了很久,资料都十分有限,即使有些朋友实现了也说的不清不楚.于是决定自己研究,耗时一周的时间实现了文 ...

  2. IOS 即时通讯的框架 配置环境

    一.了解XMPP 协议(标准)XMPP 即时通讯协议SGIP 短信网关协议 这手机发短信 移动支付和网页支付 0x23232[0,1] 0x23232 0x23232 0x23232 只有协议,必须会 ...

  3. Socket.IO介绍:支持WebSocket、用于WEB端的即时通讯的框架

    一.基本介绍 WebSocket是HTML5的一种新通信协议,它实现了浏览器与服务器之间的双向通讯.而Socket.IO是一个完全由JavaScript实现.基于Node.js.支持WebSocket ...

  4. 基于XMPP利用openfire简单的即时通讯

    功能的实现结果:能够使自己编写客户端与spark客户端信息通讯,将接受到的信息更新到textview上. 1.下载openfire并安装.设置域名,添加用户 2.下载安装spark客户端 3.jar包 ...

  5. Pilin —— 一个基于Xmpp openfire smack的即时聊天工具

    https://github.com/whfcomm/Pilin

  6. IOS XMPP(即时通讯的框架)

    #import "AppDelegate.h" #import "XMPPFramework.h" /* * 在AppDelegate实现登录 1. 初始化XM ...

  7. 【原创】轻量级移动设备即时通讯技术MobileIMSDK的常见问题解答

    申明:MobileIMSDK 目前为个人原创开源工程且已发布,现整理了一些有关MobileIMSDK的常见的问题,希望对需要的人有用,谢谢.如需与作者交流,见文章底部个人签名处,互相学习. Mobil ...

  8. Web端即时通讯技术盘点:短轮询、Comet、Websocket、SSE

    1. 前言 Web端即时通讯技术因受限于浏览器的设计限制,一直以来实现起来并不容易,主流的Web端即时通讯方案大致有4种:传统Ajax短轮询.Comet技术.WebSocket技术.SSE(Serve ...

  9. 新手入门:史上最全Web端即时通讯技术原理详解

    前言 有关IM(InstantMessaging)聊天应用(如:微信,QQ).消息推送技术(如:现今移动端APP标配的消息推送模块)等即时通讯应用场景下,大多数都是桌面应用程序或者native应用较为 ...

随机推荐

  1. MySQL相关信息(二)

    1.修改MySQL提示符 (1)连接客户端时通过参数指定 shell>mysql -u root -p --prompt  提示符 C:\Users\Administrator>mysql ...

  2. 浅谈python 手机crash和app crash循环执行问题

    ----------------引子---------------- app自动化测试人员经常遇见的问题,第一:手机抛的异常导致脚本循环停止!!!!!!!!第二:app抛的异常导致脚本循环停止!!!! ...

  3. okhttp +fastJson 在UI层的回调封装

    一直使用OkHttp 经常烦人的地方是回调方法  数据解析后必须通过handler 在主线程做操作 网上找了很多资料 发现有些都是基于Gson做的解析 fastJson 在封装时 泛型传入会有很多不方 ...

  4. (22)Properties,这不会Io流中的类,但是通常和IO流中的一些流配合使用

    可以和流相关联的集合对象Properties. Map |--Hashtable |--Properties Properties:该集合不需要泛型,因为该集合中的键值对都是String类型.既然是m ...

  5. jquery.zclip.js 不起作用

    最近有用到复制的这个功能,选用jQuery的插件,正常使用的时候,没有任何问题: $('#copy_mobile_watch_address').zclip({ path: '/dist/plugin ...

  6. CentOS 下安装 Node npm pm2

    1.node安装 参考:http://blog.csdn.net/haidaochen/article/details/7257655 下载,你需要在https://nodejs.org/en/dow ...

  7. 使用JDB调试Java程序

    Java程序中有逻辑错误,就需要使用JDB来进行调试了.调试程序在IDE中很方便了,比如这篇博客介绍了在Intellj IDEA中调试Java程序的方法. 我们课程内容推荐在Linux环境下学习,有同 ...

  8. [原]C#与非托管——动机

    Unity3D采用C#作为脚本开发语言,本来是可以直接提供代码局部更新机制的,可惜Mono和Unity3D迫于苹果的压力,在iOS上采用AOT模式运行,断绝了代码局部更新的路(任何一个具有很高知名度的 ...

  9. 老李推荐:第14章4节《MonkeyRunner源码剖析》 HierarchyViewer实现原理-装备ViewServer-端口转发 3

    formAdbRequest我们在之前已经分析过,做的事情就是组建好ADB协议的命令以待发送给ADB服务器,在我们558行中最终组建好的ADB协议命令将会如下: “host-serial:xxx:fo ...

  10. es suggest did you mean资料

    term suggester 功能介绍 term suggester 根据提供的文档提供搜索关键词的建议,也就是关键词自动纠错.该链接介绍如何使用 term suggester 语法.term sug ...