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. PHP数据访问基础知识(20161028)

    数据访问 动态页面的特征:能够读取数据库,网页的内容都是从数据库读出来的,而不是写死的 所有的程序归根结底都是对数据的增删改查 如何用服务器的PHP来操作服务器的MySQL,Apache则是用来管理, ...

  2. Broken pipe错误终极解释

    叙述 想必或多或少在Java的服务器都会遇到过这种异常,如下图        由于Java偏上层,日常开发接触系统底层的机会偏少,要搞清楚什么原因导致的这种异常,肯定是先要百度google一番. 网络 ...

  3. Knockoutjs : Unable to process binding "value:

    刚刚自学knockoutjs,老是碰到稀奇古怪的问题. 在自学knockout.js的时候经常遇到 Unable to process binding "value:的问题.目前总结了以下几 ...

  4. 【SF】开源的.NET CORE 基础管理系统系列导航

    SF是一套基于ASP.NET Core MVC+EFCore+Bootstrap开发出来的基础管理系统,源代码完全开源,可以帮助你解决C#.NET项目中重复编码的繁琐工作,让开发人员远离加班! SF ...

  5. WPF实用小工具

    Kaxaml 一款轻量级的Xaml代码编辑器,提供了可视的效果可以看到修改代码后的实时效果图.个人习惯于用它测试系统默认控件的行为和布局,小片段的xaml也可以拿到这个工具上测试效果.这款工具还提供了 ...

  6. 【子非鱼】插入排序过程呈现之java内置GUI表示

    先给代码,再给过程视频: package com.dyi.wyb.sort; import java.awt.Color; import java.awt.Graphics; import java. ...

  7. LinkedHashSet的概述和使用

    LinkedHashSet的特点: 可以保证怎么存就怎么取 package online.msym.set; import java.util.LinkedHashSet; public class ...

  8. java学习笔记 --- StringBuffer类

    1.定义:字符串缓冲区,即它是一个容器,容器中可以装很多字符.并且能够对其中的字符进行各种操作. StringBuffer的特点: 1.是一个字符串缓冲区,其实就是一个容器. 2.长度是可变,任意类型 ...

  9. nfs mount:reason given by server: Permission denied

    遇到nfs mount的问题,以前从未遇到过,问题出的很奇怪,现象是 mount: 10.1.10.22:/cicro failed, reason given by server: Permissi ...

  10. CSS写动态下拉菜单 -----2017-03-27

    动态网站第一步:动态下拉菜单 关键点: overflow:hidden max-height xx:hover {} 设置当鼠标移上之后的效果 transition:   设置过度时间 cursor: ...