XMPP協議(Extensible Messaging and PresenceProtocol,可擴展消息處理現場協議)是一種基於XML的協議,目的是爲了解決及時通訊標準而提出來的,最先是在Jabber上實現的。它繼承了在XML環境中靈活的發展性。所以,基於XMPP的應用具備超強的可擴展性。而且XML很易穿過防火牆,因此用XMPP構建的應用不易受到防火牆的阻礙。利用XMPP做爲通用的傳輸機制,不一樣組織內的不一樣應用均可以進行有效的通訊。android
這篇文章有基本的介紹,http://blog.csdn.net/xutaozero21/article/details/4873439api
Instant Messenger,及時通訊軟件,就是你們使用的QQ、MSN Messenger和Gtalk等等。其中Gtalk 就是基於XMPP 協議的一個實現,其餘的則不是。當前IM 幾乎做爲每一個上網者必然使用的工具,在國外的大型企業中有一些企業級的IM應用,可是其商業價值還沒徹底發揮出來。設想既然XMPP 協議是一個公開的協議,那麼每一個企業均可以利用它來開發適合自己企業工做,提升自身生產效率的IM;甚至,你還能夠在網絡遊戲中集成這種通訊軟件,不但讓你能夠邊遊戲邊聊天,也能夠開發出適合遊戲自己的IM 應用,好比說一些遊戲關鍵場景提醒功能,團隊語音交流等等均可以基於IM來實現。安全
這裏使用openfire、smack和spark,完成xmpp IM實現,這裏簡單介紹一下這3個的做用:服務器
openfire主要是做爲服務器,負責管理客戶端的通訊鏈接,以及提供客戶端一些通訊信息和鏈接信息。網絡
Smack主要是xmpp協議的實現,提供了一套很好的api,因此下面操做xmpp都是經過使用smack的api來實現,固然由於是在android裏,因此使用的是asmack這個包,裏面方法跟smack包差很少。jsp
Spark 是IM客戶端的實現,其實就是使用了smack 的api實現的。ide
//配置文件 參數(服務地地址,端口號,域)
ConnectionConfiguration configuration = new ConnectionConfiguration("192.168.0.110",5222,"");
//設置不須要SAS驗證
configuration.setSASLAuthenticationEnabled(false);
//設置安全類型
configuration.setSecurityMode(ConnectionConfiguration.SecurityMode.disabled);
//創建鏈接
XMPPConnection conn = new XMPPConnection(configuration);
註冊有兩種方法:工具
一種是用createAccount ,不過我測試了一下發現不能建立用戶,具體緣由不詳,下面介紹第二種。測試
AccountManager accountManagerconn.getAccountManager();
try {
= accountManager"saliya", "123456");
} catch (XMPPException e) {
e.printStackTrace();
} .createAccount(
一種是經過Registration類進行字體
Registrationnew reg = Registration;
//設置類型
reg.setType(IQ.Type.SET);
//發送到哪
reg.setTo(conn.getServiceName());
//設置用戶名
reg.setUsername("keven1");
//設置密碼
reg.setPassword("123456");
//設置其他屬性(可選)
reg.addAttribute("android", "geolo_createUser_android");
//建立包過濾器
PacketFilter filter = new AndFilter(new PacketIDFilter(reg.getPacketID()), new PacketTypeFilter(IQ.class));
//建立包收集器
PacketCollector collector = conn.createPacketCollector(filter);
//發送包
conn.sendPacket(reg);
//獲取返回信息
IQ result = (IQ) collector.nextResult(SmackConfiguration.getPacketReplyTimeout());
// 取消收集
collector.cancel();
//經過返回信息判斷
if (result == null) {
Toast.makeText(getApplicationContext(),"服務器異常" ,Toast.LENGTH_SHORT).show();
} else if (result.getType() == IQ.Type.ERROR) {
if (result.getError().toString().equalsIgnoreCase("conflict(409)")) {
Toast.makeText(getApplicationContext(),"註冊失敗,用戶已存在" , Toast.LENGTH_SHORT).show();
} else {
Toast.makeText(getApplicationContext(), "註冊失敗", Toast.LENGTH_SHORT).show();
}
} else if (result.getType() == IQ.Type.RESULT) {
Toast.makeText(getApplicationContext(), "註冊成功", Toast.LENGTH_SHORT).show();
} ()
一、登陸
conn.login("kooeasy","********");
二、獲取聯繫人
Roster roster = conn.getRoster(); //獲取名冊
Collection<RosterEntry> entries = roster.getEntries(); //獲取聯繫人
三、獲取名片
//建立名片
VCard vCard = new VCard();
//加載名片(鏈接,用戶)
try {
vCard.load(conn, user);
//獲取頭像
ByteArrayInputStream inputStream = new ByteArrayInputStream(vCard.getAvatar());
Bitmap mAvatar = BitmapFactory.decodeStream(inputStream);
...
} catch (XMPPException e) {
e.printStackTrace();
}
四、添加好友、分組
Roster roster = conn.getRoster(); roster.createGroup("group"); try { roster.createEntry("userName","user",new String[]{"Group"}); roster.removeEntry(); } catch (XMPPException e) { e.printStackTrace(); }
//建立聊天管理器
ChatManager chatManager = conn.getChatManager();
//建立一個聊天:(用戶,聊天監聽)再此添加聊天監聽沒法監聽Bug?
Chat msg = chatManager.createChat(user, null);
//給聊天管理器添加了聊天監聽
chatManager.addChatListener(new ChatManagerListener() {
@Override
public void chatCreated(Chat chat, boolean b) {
//給聊天,添加監聽
chat.addMessageListener(new MessageListener() {
@Override
public void processMessage(Chat chat, Message message) {
Log.i("MSG", message.getBody());
}
});
}
});
try {
//開始發送消息
msg.sendMessage("你好 能收到嗎?");
} catch (XMPPException e) {
e.printStackTrace();
}
關於Smack
XMPP——Smack[2]會話、消息監聽、字體表情和聊天窗口控制