• 1. XMPP 介绍 XMPP 介绍 它就是一个发送接收处理消息的协议,但是这个协议发送的消息,既不是二进制的东东也不是字符串,而是XML。 XMPP主要显著的优点主要有以下几个方面: 1、 分布式  任何人都可以运行自己的XMPP服务器,它没有主服务器 2、 安全性很高。使用SASL及TLS等技术的可靠安全性 3、 开发性 它是开源的,易于进行学习和了解 4、 跨平台  毋庸置疑,使用的XML进行传输的。 扩展: 1、XMAPP详细介绍:http://www.cnblogs.com/hanyonglu/archive/2012/03/04/2378956.html 2、服务器消息推送机制: http://www.iteye.com/topic/1117043
  • 2. IMInstant Messenger,及时通信软件,就是大家使用的QQ、MSN Messenger和Gtalk等等。其中Gtalk 就是基于XMPP 协议的一个实现,其他的则不是。当前IM 几乎作为每个上网者必然使用的工具,在国外的大型企业中有一些企业级的IM应用,但是其商业价值还没完全发挥出来。设想既然XMPP 协议是一个公开的协议,那么每个企业都可以利用它来开发适合本身企业工作,提高自身生产效率的IM;甚至,你还可以在网络游戏中集成这种通信软件,不但让你可以边游戏边聊天,也可以开发出适合游戏本身的IM 应用,比如说一些游戏关键场景提醒功能,团队语音交流等等都可以基于IM来实现。
  • 3. XMPP IM 包括服务器端——Openfire,客户端——Spark,XMPP 传输协议的实现——Smack(记住,XMPP是一个协议,协议是需要实现的,Smack起到的就是这样的一个作用)
  • 4. Spark Spark 提供了客户端一个基本的实现,并提出了一个很好的插件架构,这对于开发者来说不能不说是一个福音。我强烈建议基于插件方式来实现你新增加的功能,而不是去改它的源代码,这样有利于你项目架构,把原始项目的影响降到最低。
  • 5. Openfire Openfire 是基于XMPP 协议的IM 的服务器端的一个实现,虽然当两个用户连接后,可以通过点对点的方式来发送消息,但是用户还是需要连接到服务器来获取一些连接信息和通信信息的,所以服务器端是必须要实现的。Openfire 也提供了一些基本功能,但真的很基本的!庆幸的是,它也提供插件的扩展,像Spark 一样,同样强烈建议使用插件扩展的方式来增加新的功能,而不是修改人家的源代码。
  • 6. Smack Smack 是一个XMPP 协议的Java 实现,提供一套可扩展的API,不过有些时候,你还是不得不使用自己定制发送的XML 文件内容的方式来实现自己的功能
  • 7. 三者之间的关系 client 端和server端都可以通过插件的方式来进行扩展,smack是二者传递数据的媒介。
  • 8. Smack—init建立连接private Connection connection; private ConnectionConfiguration config; /** openfire服务器address */ private final static String server = "127.0.0.1"; @Before public void init() { config = new ConnectionConfiguration(server, 5222); connection = new XMPPConnection(config); /** 建立连接 */ connection.connect(); } catch (XMPPException e) { e.printStackTrace(); }
  • 9. Smack—init关闭连接 @After public void destory() { if (connection != null) { connection.disconnect(); connection = null; } } }
  • 10. Smack—获取角色 public static Roster getRoster(Connection connection, String username, String password){ try { /** 用户登陆,用户名、密码 */ connection.login(username,password); } catch (XMPPException e) { e.printStackTrace(); } /** 所有用户组 */ Roster roster = connection.getRoster(); return roster; }
  • 11. Smack—创建用户/** * 创建账户 * * @param args */ public static void createUser(Connection connection, String username, String password) { AccountManager accountManager = connection.getAccountManager(); try { accountManager.createAccount(username, password); } catch (XMPPException e) { e.printStackTrace(); } }
  • 12. Smack—创建用户到分组public static void createUserToGroup(Roster roster,String groupName,Connection connection, String jid, String nickName,String username,String password) { AccountManager accountManager = connection.getAccountManager(); try { accountManager.createAccount(username,username.length()>0?password:SmackGlobalUtils.PASSWORD); } catch (XMPPException e) { e.printStackTrace(); } try { String[] groups = new String[] { groupName}; roster.createEntry(jid, nickName, groups); } catch (Exception e) { e.printStackTrace(); } }
  • 13. Smack—建立会话/** 设置状态 */ try { // connection.login("franky", "123456"); connection.login("j1804030765410008", "123456"); } catch (XMPPException e) { e.printStackTrace(); } /** 设置状态 */ Presence presence = new Presence(Presence.Type.available); presence.setStatus("Q我吧"); connection.sendPacket(presence); ChatManager chatManager = connection.getChatManager(); chatManager.addChatListener(new MyChatManagerListener()); /** 为指定用户创建一个chat,MyMessageListeners用于监听对方发过来的消息 */ Chat chat = chatManager.createChat("j1888888888810008@ailksaas.com", new MyMessageListener()); try { /** 发送消息 */ chat.sendMessage("h!~ guanxf,my name is franky,i love you……"); /** 用message对象发送消息 */ Message message = new Message(); message.setBody("message,hello "); message.setProperty("color", "red"); chat.sendMessage(message); } catch (XMPPException e) { e.printStackTrace(); }
  • 14. 完了