做毕设,涉及到了使用XMPP协议+Openfire+Smack开发一个手机应用的子模块,找到些资料,用来分享。找过很多参考的资料,但就一个比较新而且简洁清晰的,故而收藏并转载(小白见谅)。
什么是XMPP?
XMPP(Extensible Messaging and Presence Protocal,可拓展消息与在线协议),是一种基于可拓展标记语言XML的协议,具有开放性、拓展性、安全性良好等诸多优势,可以实现与使用其他协议的及时通信软件的互通互联,发展前景良好。XMPP解决了IM系统不能与其他非IM系统互联的问题。在XMPP协议中,无论是即时消息还是在线状态都基于XML(查自:基于XMPP协议的Android即时消息APP的设计与实现_杨继承)。
参考文档:http://www.igniterealtime.org/projects/smack/documentation.jsp
API手册:http://download.igniterealtime.org/smack/dailybuilds/javadoc/
注意:基于smack4.1开发IM时,在导入smack本身的jar包之外,还需要以下第三方库的支持,请事先准备下载: 1. commons-logging-1.2.jar 2. httpclient-4.4.jar 3. jxmpp-core-0.4.1.jar 4. jxmpp-util-cache-0.4.1.jar 5. minidns-0.1.1.jar 6. xpp3-1.1.4.jar( 开发smack4.1.5 实现xmpp 所需要的所有jar,包括jxmpp-core-0.4.1,jxmpp-util-cache-0.4.1,minidns-0.1.3 链接为:http://download.csdn.net/detail/kill_bugs/9392315 )
PS:注意事项均为遇到问题后在网上寻到,请自行辨别!
下面是转帖内容:
Openfire部署:http://blog.csdn.net/shimiso/article/details/8816558
Spark下载:http://www.igniterealtime.org/downloads/index.jsp
APP的简单实现:http://www.cnblogs.com/5207/p/5377510.html
下面是一个APP的简单实现
简单的写了一个单例的类:XmppConnectionService,主要是负责与Xmpp服务器的通讯管理,这里面最主要的就是建一个连接,由于smack(4.1.x)的版本更新后和之前老的api不一样了。所以在我在网上看到很多资料都是比较老的写法,试了一段时间都是失败。后来找到方法:
public void Connect (String userName, String pwd){ if (_xmppConnection != null && _xmppConnection.isConnected()) { return; } XMPPTCPConnectionConfiguration.Builder configBuilder = XMPPTCPConnectionConfiguration.builder(); configBuilder.setHost("192.168.45.41"); configBuilder.setPort(5222); configBuilder.setUsernameAndPassword(userName, pwd); configBuilder.setServiceName("zrtc"); configBuilder.setCustomSSLContext(getSslContent()); //configBuilder.setSecurityMode(ConnectionConfiguration.SecurityMode.disabled); _xmppConnection = new XMPPTCPConnection(configBuilder.build()); new Thread() { @Override public void run() { try { _xmppConnection.connect(); _xmppConnection.login(); } catch (IOException e) { Log.e("XMPP_CONNLOGIN", e.getMessage()); } catch (XMPPException e) { Log.e("XMPP_CONNLOGIN", e.getMessage()); } catch (SmackException e) { Log.e("XMPP_CONNLOGIN", e.getMessage()); } } }.start(); }
这段代码里主要是两点注意:
1、服务器通讯要用自定义证书的话要用自定义的SSLConent,说白点就是不验证证书是否可信。这玩意不知道使用有CA签名的证书会不会有这问题。
2、connect要使用线程来执行,这是由于android中不允许在主线程中跑这种耗时的代码,影响界面响应
获取登录用户的好友列表:
Roster roster = Roster.getInstanceFor(_conn); Setentries = roster.getEntries();
创建聊天会话:
private void createChat(Intent intent) { _jid = intent.getStringExtra(JID); _chat = _chatMgr.createChat(_jid); _chat.addMessageListener(new ChatMessageListener() { @Override public void processMessage(Chat chat, Message message) { addMessage(message); } }); }
会话还可以监听消息,这样对方发来消息就可以进行处理。比如显示在聊天记录里。
发送聊天信息:
_sendButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { EditText sendText = (EditText) findViewById(R.id.textinput); String msg = sendText.getText().toString(); if (!msg.equals("")) { Message message = new Message(); message.setTo(_jid); message.setBody(msg); message.setType(Message.Type.chat); addMessage(message); try { _chat.sendMessage(message); } catch (SmackException.NotConnectedException e) { e.printStackTrace(); } sendText.setText(""); } } });
还是通过会话_chat,它有一个方法sendMessage就可以将消息发送出去,挺简单的吧。
最后贴一下聊天的效果吧,真的好搓:
最后备注一下,这个android的客户端demo代码参考了一个开源项目:https://github.com/siacs/Conversations