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(); } } }
智者,寡言而多行