|
87Android中基于XMPP協(xié)議的即時(shí)聊天系統(tǒng)的開發(fā)筆記 - 注冊(cè)、登陸
登錄前我們要知道用戶名和密碼(這不是廢話么......),XMPP的用戶名又稱JID,先看一個(gè)XMPP的用戶名范例:wumeng@yiqiwan.com/smack,wumeng相當(dāng)于自定義的用戶名,yiqiwan.com就是上文的結(jié)點(diǎn)標(biāo)識(shí)符,smack可有可無,我理解為是資源標(biāo)識(shí)符的意思,可以自己修改,Android中用asmack默認(rèn)就是smack,我沒管過它。
注冊(cè):
我們的服務(wù)器是HTTP+XMPP,常規(guī)數(shù)據(jù)從HTTP服務(wù)器獲取,聊天才用XMPP;因?yàn)槲覀兊挠脩羰窃诰W(wǎng)站注冊(cè),所以在后臺(tái)我們注冊(cè)用戶以后直接向XMPP的服務(wù)器數(shù)據(jù)庫中插入用戶數(shù)據(jù),不用客戶端注冊(cè),不過為了寫如何注冊(cè),我百度了一下,調(diào)試了一下,發(fā)現(xiàn)沒有問題,就貼上來了:
Registration reg = new Registration();
reg.setType(IQ.Type.SET);
reg.setTo(BaseXmpp.getConnection().getServiceName());
reg.setUsername("wumeng");// 注意這里注冊(cè)時(shí),參數(shù)是用戶名,不是JID,是@前面的部分。
reg.setPassword("mengge123");
reg.addAttribute("RegType", "Android");// 這邊addAttribute不能為空,否則出錯(cuò)。
PacketFilter filter = new AndFilter(new PacketIDFilter(reg.getPacketID()),
new PacketTypeFilter(IQ.class));
PacketCollector collector = BaseXmpp.getConnection().createPacketCollector(filter);
BaseXmpp.getConnection().sendPacket(reg);
IQ result = (IQ) collector.nextResult(SmackConfiguration.getPacketReplyTimeout());
// Stop queuing results
collector.cancel();// 停止請(qǐng)求results(是否成功的結(jié)果)
if (result == null) {
System.out.println("服務(wù)器沒有返回結(jié)果");
} else if (result.getType() == IQ.Type.ERROR) {
if (result.getError().toString().equalsIgnoreCase("conflict(409)")) {
System.out.println("這個(gè)賬號(hào)已經(jīng)存在");
} else {
System.out.println("注冊(cè)失敗");
}
} else if (result.getType() == IQ.Type.RESULT) {
System.out.println("恭喜你注冊(cè)成功");
}
代碼稍微修改了一下,很簡(jiǎn)單清晰,沒什么可說的reg.addAttribute這里可以添加自定義的字段,比如性別什么的,看自己需求了,但是不能為空,我這里用了注冊(cè)類型。
登陸:
Asmack的登陸很簡(jiǎn)單,只需要JID前面的用戶名和密碼即可,無需再去拼裝JID什么的,代碼如下:
// 登陸XMPP服務(wù)器
BaseXmpp.getConnection().login("wumeng","mengge123");
登陸前最好用BaseXmpp.getConnection().isConnected()方法先驗(yàn)證下是否已經(jīng)初始化XMPP,否則會(huì)報(bào)錯(cuò);
登陸后可以使用BaseXmpp.getConnection().isAuthenticated()查看是否登陸成功 |
上一篇: 一健查詢?cè)捹M(fèi)下一篇: 攝像頭編程
|