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. iOS网络编程笔记——XML文档解析

    今天利用多余时间研究了一下XML文档解析,虽然现在移动端使用的数据格式基本为JSON格式,但是XML格式毕竟多年来一直在各种计算机语言之间使用,是一种老牌的经典的灵活的数据交换格式.所以我认为还是很有 ...

  2. mybatis源码跟踪

    第一步:从web.xml进入dispatcherServlet进入前端控制器 第二步:使用handlerMapping 获得handlerChain 第三步:使用适配器执行handler获取model ...

  3. JavaWeb之多语言国际化

    这周打算把国际化.JDBC和XML学习一下,从下周就开始学习三大框架,再坚持一个半月吧就能入门JavaWeb了,上周周末两天过的真是生不如死,两天坐在家里,醒来就写博客,原本在公司也自己操作了一遍,其 ...

  4. spring boot gradle build:bootRepackage failed

    When running 'gradle clean build' on my spring boot project (version 1.3.6.RELEASE) on windows 10 (a ...

  5. 关于mui选择器的使用

    使用mui引入选择器的picker.js.poppicker.js.及他们的css文件之后引入代码与点击确定之后的状态: document.querySelector('#osex').addEven ...

  6. 前端学PHP之Smarty模板引擎

    前面的话 对PHP来说,有很多模板引擎可供选择,但Smarty是一个使用PHP编写出来的,是业界最著名.功能最强大的一种PHP模板引擎.Smarty像PHP一样拥有丰富的函数库,从统计字数到自动缩进. ...

  7. pyqt系列原创入门教程

    pyqt4入门教程 python pyqt4 PyQt是一个创建GUI应用程序的工具包.它是Python编程语言和Qt库的成功融合.Qt库是目前最强大的库之一. 通过pyqt可以实现很多我们想要的功能 ...

  8. 用Caffe生成对抗样本

    同步自我的知乎专栏:https://zhuanlan.zhihu.com/p/26122612 上篇文章 瞎谈CNN:通过优化求解输入图像 - 知乎专栏 中提到过对抗样本,这篇算是针对对抗样本的一个小 ...

  9. 踩坑实录 Android studio中关于 No cached version of **** available for of处理办法

    当我们添加某些依赖库(Okhttp.Retrofit)时, Android studio 会报如下错误: Error:A problem occurred configuring project ': ...

  10. cookie技术简介

    Cookie简介 众所周知,HTTP协议是一个无状态的协议.一个Web应用由很多个Web页面组成,每个页面都有唯一的URL来定义.用户在浏览器的地址栏输入页面的URL,浏览器就会向Web Server ...