openfire+smack 实现即时通讯基本框架
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 实现即时通讯基本框架的更多相关文章
- openfire+spark+smack实现即时通讯
近公司项目需要用到即时通讯功能,经过调研发现openfire+spark+smack可以实现.在网上找了很久,资料都十分有限,即使有些朋友实现了也说的不清不楚.于是决定自己研究,耗时一周的时间实现了文 ...
- IOS 即时通讯的框架 配置环境
一.了解XMPP 协议(标准)XMPP 即时通讯协议SGIP 短信网关协议 这手机发短信 移动支付和网页支付 0x23232[0,1] 0x23232 0x23232 0x23232 只有协议,必须会 ...
- Socket.IO介绍:支持WebSocket、用于WEB端的即时通讯的框架
一.基本介绍 WebSocket是HTML5的一种新通信协议,它实现了浏览器与服务器之间的双向通讯.而Socket.IO是一个完全由JavaScript实现.基于Node.js.支持WebSocket ...
- 基于XMPP利用openfire简单的即时通讯
功能的实现结果:能够使自己编写客户端与spark客户端信息通讯,将接受到的信息更新到textview上. 1.下载openfire并安装.设置域名,添加用户 2.下载安装spark客户端 3.jar包 ...
- Pilin —— 一个基于Xmpp openfire smack的即时聊天工具
https://github.com/whfcomm/Pilin
- IOS XMPP(即时通讯的框架)
#import "AppDelegate.h" #import "XMPPFramework.h" /* * 在AppDelegate实现登录 1. 初始化XM ...
- 【原创】轻量级移动设备即时通讯技术MobileIMSDK的常见问题解答
申明:MobileIMSDK 目前为个人原创开源工程且已发布,现整理了一些有关MobileIMSDK的常见的问题,希望对需要的人有用,谢谢.如需与作者交流,见文章底部个人签名处,互相学习. Mobil ...
- Web端即时通讯技术盘点:短轮询、Comet、Websocket、SSE
1. 前言 Web端即时通讯技术因受限于浏览器的设计限制,一直以来实现起来并不容易,主流的Web端即时通讯方案大致有4种:传统Ajax短轮询.Comet技术.WebSocket技术.SSE(Serve ...
- 新手入门:史上最全Web端即时通讯技术原理详解
前言 有关IM(InstantMessaging)聊天应用(如:微信,QQ).消息推送技术(如:现今移动端APP标配的消息推送模块)等即时通讯应用场景下,大多数都是桌面应用程序或者native应用较为 ...
随机推荐
- HTML5初步了解
一.使用HTML5的十大原因 你难道还没有考虑使用HTML5? 当然我猜想你可能有自己的原因:它现在还没有被广泛的支持,在IE中不好使,或者你就是喜欢写比较严格的XHTML代码.HTML5是w ...
- android添加权限--eclipse
首先进入清单文件 2.点击下面的permissions----Add 3.选择Uses permission-----OK 4.选择需要的权限 5.查看代码,,已经添加完毕
- spdlog源码阅读 (3): log_msg和BasicWriter
4. log_msg和它的打手BasicWriter 在spdlog源码阅读 (2): sinks的创建和使用中,提到log_msg提供了存储日志的功能.那么到底在spdlog中它是怎么 起到这个作用 ...
- GreenDao 工具类 --- 使用 Json 快速生成 Bean、表及其结构,"炒鸡"快!
作者:林冠宏 / 指尖下的幽灵 掘金:https://juejin.im/user/587f0dfe128fe100570ce2d8 博客:http://www.cnblogs.com/linguan ...
- django进阶-3
先看效果图: 登陆admin后的界面: 查看作者: 当然你也可以定制admin, 使界面更牛逼 数据库表结构: app01/models.py from django.db import models ...
- Entity Framework 新手入门友好实例
起因 因为实习的原因,程序之中用到了较多的数据库操作逻辑.如果每一处数据库操作都手写的话,工作量较大且后期不易于维护,所以希望能通过 ORM 框架来解决这两个问题. 在昨天之前,对于 ORM 这个词汇 ...
- node.js平台下,利用cookie实现记住密码登陆(Express+Ejs+Mysql)
本博文需有node.js+express+mysql入门基础,若基础薄弱,可参考博主的其他几篇node.就是博文: 1.下载Mysql数据库,安装并配置 创建用户表供登录使用: 2.node.js平台 ...
- linux 下日常使用便利工具
Nautilus 你工作中有在GUI和命令行之间切来切去吗?当你总是要在命令行中输入你要进入的目录的时候,你有沮丧无奈过吗?如果有的话,那么,你一定要试下这个nautilus插件 —— nautilu ...
- 原生JS实现弹出窗口的拖拽
上一篇说了一下弹出窗口功能的实现思路,一般情况下紧接着就会需要做到弹窗的移动,当然现在有很插件.库比如hammer可以使用,效率也非常好.但我觉得还是有必要了解一下原生JS的实现思路及方式,如下: 思 ...
- Object-C定时器,封装GCD定时器的必要性!!! (二)
上一篇:Object-C定时器,封装GCD定时器的必要性!!! (一) 上一篇认识了Object-C中的几种定时器,这一篇将Dispatch定时器(GCD定时器)封装起来. p.p1 { margin ...