freepeople性欧美熟妇, 色戒完整版无删减158分钟hd, 无码精品国产vα在线观看DVD, 丰满少妇伦精品无码专区在线观看,艾栗栗与纹身男宾馆3p50分钟,国产AV片在线观看,黑人与美女高潮,18岁女RAPPERDISSSUBS,国产手机在机看影片

正文內(nèi)容

xmpp協(xié)議的使用-文庫吧

2025-04-29 05:01 本頁面


【正文】 private void processPacket(Packet packet) { if(packet == null) { return。 } // Loop through all collectors and notify the appropriate ones. for(PacketCollector collector : ()) { (packet)。 } // Deliver the ining packet to listeners. (newListenerNotification(packet))。 } /** * A runnable to notify all listeners of a packet. */ private class ListenerNotification implements Runnable { Private Packet packet。 Public ListenerNotification(Packet packet) { = packet。 } public void run() { for(ListenerWrapper listenerWrapper : .values()) { (packet)。 } } }}創(chuàng)建該類時就初始化線程和ExecutorService ,接著調(diào)用resetParser() 方法為parser設(shè)置輸入源(這里是重點(diǎn),parser的數(shù)據(jù)都是通過這里獲?。{(diào)用startup啟動線程,循環(huán)監(jiān)聽parser,如果接收到消息根據(jù)消息協(xié)議的不同將調(diào)用PacketParserUtils類里的不同方法,這里調(diào)用parseMessage()該方法主要處理message的消息,在該方法里分析message消息并返回packet包。返回的包將調(diào)用processPacket方法,先通知所有注冊了PacketCollector的監(jiān)聽,接著消息((newListenerNotification(packet))。 )傳遞給所有注冊了PacketListener的監(jiān)聽。這樣在activity開始之前注冊的那個監(jiān)聽事件就會觸發(fā),從而完成了整個流程。 7以上.剩下的就是一些輔助包,很簡單。比如PacketCollector 這個類,它的用處主要用來處理一些需要在發(fā)送后需要等待一個答復(fù)這樣的請求。protected synchronized void processPacket(Packet packet) { (PacketCollectorprocessPacket)。 if(packet == null) { return。 } if(packetFilter== null|| (packet)) { while(!(packet)) { ()。 } } }Public Packet nextResult(longtimeout) { longendTime = () + timeout。 (nextResult)。 do{ try{ (timeout, )。 } catch(InterruptedException e) { /* ignore */ } } while(() endTime)。 return null。 }該方法就是將獲取到的包,先過濾然后放到隊(duì)列里,最后通過nextResult來獲取包,這樣就完成一個請求收一個答復(fù)。 這樣整個流程就完成了,最后總結(jié)一下,如圖(就這么簡單^0^): 項(xiàng)目下載(只有客戶端的,服務(wù)端的就是一個簡單的socket接受,為了鍛煉一下大家的編寫代碼的能力,服務(wù)器那個只能自己寫咯^0^,其實(shí)是懶得上傳了,代碼很簡單的)android asmack 注冊 登陸 聊天 多人聊天室 文件傳輸XMPP協(xié)議簡介XMPP協(xié)議(Extensible Messaging and PresenceProtocol,可擴(kuò)展消息處理現(xiàn)場協(xié)議)是一種基于XML的協(xié)議,目的是為了解決及時通信標(biāo)準(zhǔn)而提出來的,最早是在Jabber上實(shí)現(xiàn)的。它繼承了在XML環(huán)境中靈活的發(fā)展性。因此,基于XMPP的應(yīng)用具有超強(qiáng)的可擴(kuò)展性。并且XML很易穿過防火墻,所以用XMPP構(gòu)建的應(yīng)用不易受到防火墻的阻礙。利用XMPP作為通用的傳輸機(jī)制,不同組織內(nèi)的不同應(yīng)用都可以進(jìn)行有效的通信。這篇文章有基本的介紹,IMInstant Messenger,及時通信軟件,就是大家使用的、MSN Messenger和Gtalk等等。其中Gtalk 就是基于XMPP 協(xié)議的一個實(shí)現(xiàn),其他的則不是。當(dāng)前IM 幾乎作為每個上網(wǎng)者必然使用的工具,在國外的大型企業(yè)中有一些企業(yè)級的IM應(yīng)用,但是其商業(yè)價值還沒完全發(fā)揮出來。設(shè)想既然XMPP 協(xié)議是一個公開的協(xié)議,那么每個企業(yè)都可以利用它來開發(fā)適合本身企業(yè)工作,提高自身生產(chǎn)效率的IM;甚至,你還可以在網(wǎng)絡(luò)游戲中集成這種通信軟件,不但讓你可以邊游戲邊聊天,也可以開發(fā)出適合游戲本身的IM 應(yīng)用,比如說一些游戲關(guān)鍵場景提醒功能,團(tuán)隊(duì)語音交流等等都可以基于IM來實(shí)現(xiàn)。 本文主要講解在android使用xmpp協(xié)議進(jìn)行即時通信,所涉及3個主要的東西,它們是openfire、smack和spark,這個三個東東結(jié)合起來就是完整的xmpp IM實(shí)現(xiàn),這里簡單介紹一下這3個東東在下文的作用:openfire主要是作為服務(wù)器,負(fù)責(zé)管理客戶端的通信連接,以及提供客戶端一些通信信息和連接信息。Smack主要是xmpp協(xié)議的實(shí)現(xiàn),提供了一套很好的api,所以下面操作xmpp都是通過使用smack的api來實(shí)現(xiàn),當(dāng)然因?yàn)槭窃赼ndroid里,所以使用的是asmack這個包,里面方法跟smack包差不多。Spark 是IM客戶端的實(shí)現(xiàn),其實(shí)就是使用了smack 的api實(shí)現(xiàn)的。 下圖展示了三者之間的關(guān)系:(很明顯這個圖是偷別人的,具體是哪里我忘了,因?yàn)橘Y料都是復(fù)制到文檔后慢慢研究看的)從圖上可以了解到,client 端和server端都可以通過插件的方式來進(jìn)行擴(kuò)展,smack是二者傳遞數(shù)據(jù)的媒介。 配置openfire服務(wù)器具體步驟請移步:配置成功如果以后ip地址變了,那肯定又是開不了,解決辦法請移步:配置成功后,在服務(wù)器創(chuàng)建一個簡單的用戶來測試,然后安裝spark,設(shè)置好服務(wù)器的ip與端口,使用剛才創(chuàng)建的用戶登錄,登錄OK說明服務(wù)器成功搭建。Android IM功能(因?yàn)槭菧y試demo,因此界面超級簡陋,代碼都是給出重要的一部分,剩余的可以在最后下面項(xiàng)目查看) 配置要求android 、 、myeclipse連接服務(wù)器在打開軟件后會開始初始化,完成與openfire服務(wù)器的連接,設(shè)置一些配置static{ =true。 finalConnectionConfiguration connectionConfig =newConnectionConfiguration( host, 5222,)。 // Google talk // ConnectionConfiguration connectionConfig = new // ConnectionConfiguration( // , 5222, )。 // (false)。 =newXMPPConnection(connectionConfig)。 =true。 ProviderManager pm =()。 configure(pm)。 }注冊模塊注冊有兩種方法:一種是用createAccount ,不過我測試了一下發(fā)現(xiàn)不能創(chuàng)建用戶,具體原因不詳,下面介紹第二種。如上圖:注冊成功后服務(wù)器將多了ggg用戶。具體實(shí)現(xiàn)如下:Registration reg = newRegistration()。 ()。 (().getServiceName())。 (().toString())。 (().toString())。 (android, geolo_createUser_android)。 (reg:+ reg)。 PacketFilter filter = newAndFilter(newPacketIDFilter(reg .getPacketID()), newPacketTypeFilter())。 PacketCollector collector = () .createPacketCollector(filter)。 ().sendPacket(reg)。 result= (IQ) (SmackConfiguration .getPacketReplyTimeout())。 // Stop queuing results ()。 if(result== null) { (getApplicationContext(), 服, ).show()。 } else if(() == ) { if(().toString().equalsIgnoreCase( conflict(409))) { (getApplicationContext(), 這, ).show()。 } else{ (getApplicationContext(), 注, ).show()。 } } else if(() == ) { (getApplicationContext(), 恭, ).show()。 }使用注冊類,設(shè)置好注冊的用戶名密碼和一些屬性字段,直接設(shè)置包過濾,根據(jù)這個過濾創(chuàng)建一個結(jié)果集合,發(fā)送注冊信息包,等待獲取結(jié)果,剩余就是判斷結(jié)果內(nèi)容. 登錄模塊登錄比較簡單().connect()。// connectString account = ().toString()。String password = ().toString()。// 保存用戶和密碼(ACCOUNT_KEY, account)。(PASSWORD_KEY, password)。().login(account, password)。// login// login success (login success)。= account。(() .getUser())。// 登錄成功后發(fā)現(xiàn)在線狀態(tài)Presence presence = newPresence()。().sendPacket(presence)。// 開始主界面Intent intent = newIntent(, )。startActivity(intent)。 獲取聯(lián)系人模塊(ActivityMain 主界面)獲取聯(lián)系人并將相關(guān)信息保存到一個list數(shù)組里,最后通知listview更新界面roster= ()。 public voidupdateRoster() { CollectionRosterEntry entries = ()。 for(R
點(diǎn)擊復(fù)制文檔內(nèi)容
規(guī)章制度相關(guān)推薦
文庫吧 www.dybbs8.com
備案圖鄂ICP備17016276號-1