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. Javascript基础知识小测试(一)

    这里罗列了<你不知道的js>上卷的一些知识点以及小问题,如果你想巩固一下js那么就和我一起来看看吧. 如果你能不看书就回答上80%的问题说明你js的这一部分学得还不错,再接再厉. 作用域和 ...

  2. java-信息安全(七)-基于非对称加密,对称加密等理解HTTPS

    概述 java-信息安全(一)-BASE64,MD5,SHA,HMAC java-信息安全(二)-对称加密算法DES,3DES,AES,Blowfish,RC2,RC4 java-信息安全(四)-数据 ...

  3. 【js数据结构】栈解决佩兹糖果盒问题

    现实生活中栈的一个例子是佩兹糖果盒. 想象一下你有一盒佩兹糖果, 里面塞满了红色. 黄色和白色的糖果, 但是你不喜欢黄色的糖果. 使用栈( 有可能用到多个栈) 写一段程序, 在不改变盒内其他糖果叠放顺 ...

  4. 记录Winform开发过程中遇到的情况

    前两天开发了个Winform操作Excel和数据库的一个小程序,把Winform的一些东西又给捡了起来,当中又学到了一些新的东西,特来写出来留作纪念. 一.CSKIN美化框架的使用 刚开始做的时候,发 ...

  5. 使用Topshelf组件构建简单的Windows服务

    很多时候都在讨论是否需要了解一个组件或者一个语言的底层原理这个问题,其实我个人觉得,对于这个问题,每个人都有自己的看法,个人情况不同,选择的方式也就会不同了.我个人觉得无论学习什么,都应该尝试着去了解 ...

  6. 当Node.js遇见Docker

    Node.js Best Practices - How to Become a Better Developer in 2017提到的几点,我们Fundebug深有同感: 使用ES6 使用Promi ...

  7. [python爬虫]爬取学校教务处成绩

    学校教务处网站 登陆窗口 表单数据 观察登陆窗口和提交的表单数据可知只要将账号.密码.验证码正确赋值提交即可模拟登陆. 账号和密码都有,问题的关键就在验证码上. 右键验证码图片审查观察源码如下图: 刚 ...

  8. linux最小安装

    (1)系统安装类型选择及自定义额外包组 进入如图2-28所示界面.上半部分是系统定制的不同的系统安装类型选择项,默认是“Desktop”,这里我们选择“Minimal”,即最小化安装,下半部分是在上面 ...

  9. ECMAScript6-解构

    ▓▓▓▓▓▓ 大致介绍 解构:就是将声明的一组变量和与相同结构的数组或者对象的元素数值一一对应,并将变量相对应元素进行赋值 ▓▓▓▓▓▓ 数组解构 例子: let [a,b,c] = [1,2,3]; ...

  10. 3.Maven坐标和依赖

    1.1 何为Maven坐标 正如之前所说的,Maven的一大功能就是管理项目依赖.为了能自动化地解析任何一个Java构件,Maven就必须将它们唯一标识,这就依赖管理的底层基础——坐标. 1.2 坐标 ...