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

正文內(nèi)容

xmpp協(xié)議客戶端的實現(xiàn)-資料下載頁

2024-11-05 08:09本頁面

【導(dǎo)讀】隨著互聯(lián)網(wǎng)的普及和發(fā)展,即時消息通信軟件已經(jīng)成為人們交流的重要手段?;蛘畽C(jī)關(guān)中,除了傳統(tǒng)的信息交流手段外,即時通信作為一種更加有效的交流方式,逐漸得到了廣泛應(yīng)用。無論是企業(yè)還是政府機(jī)關(guān),使用個人版的即時通信軟件均有安全。XMPP協(xié)議是一系列源代碼開放的、以XML為基礎(chǔ)的協(xié)議,其已經(jīng)成為IETF的標(biāo)準(zhǔn)。本文研究的是一個基于XMPP協(xié)議企。業(yè)級通訊工具客戶端的設(shè)計與實現(xiàn)。本文的主要內(nèi)容如下:。所做的工作和意義進(jìn)行了簡要的介紹;構(gòu)、XMPP的地址空間、XMPP的三個頂級元素和XMPP的安全機(jī)制等;簡單地介紹了基于XMPP的OpenFire服務(wù)器與Smack開發(fā)包;應(yīng)XMPP協(xié)議的實現(xiàn)過程,以及整個客戶端運(yùn)行于XMPP協(xié)議上的的基本流程等;及觀察者模式綜合運(yùn)用,以使交互界面實現(xiàn)實時更新并實現(xiàn)了兩種好友列表顯示方式;文章的末尾總結(jié)了現(xiàn)階段的工作,并提出下一步的工作設(shè)想。

  

【正文】 用戶登錄 信息收發(fā) 用戶 注冊 好友列表 TLS 加密 SASL 驗證 狀態(tài)訂閱 接收信息 發(fā)送信息 添加好友 刪除好友 發(fā)送狀態(tài)改變 接收好友更新 21 由于協(xié)議的通訊內(nèi)容都是由 XML 流來承載 , 因此在客戶端與服務(wù)器的交互中需要 XML 解析模塊的參與。它主要負(fù)責(zé)將客戶端的數(shù)據(jù)編碼成 XML 流的格式發(fā)送給服務(wù)器 , 并將從服務(wù)器端接收的 XML 流解析成客戶端可以理解的數(shù)據(jù)。 (5)應(yīng)用 編程 接口: 這里為 Smack API, 主要是對協(xié)議層的模塊內(nèi)容進(jìn)行了封裝 , 交互界面通過應(yīng)用程序接口統(tǒng)一調(diào)用。用戶 UI 部分只要調(diào)用相應(yīng)的接口就可以方便的進(jìn)行操作 , 對上層而言屏蔽了協(xié)議的底層設(shè)計 , 使得 UI 的設(shè)計更為簡化 , 同時也增強(qiáng)了系統(tǒng)的可擴(kuò)展性。 表 2 描述了與用戶交互直接相關(guān)的幾個方法接口 。 XMPP 客戶端各項服務(wù)請求 如果用戶成功注冊或登錄成功 , 客戶端的登錄框會消失后出現(xiàn)一個主窗體 , 用戶就通過操作圖形界面來實現(xiàn)對客戶端的各項服務(wù)請求 , 如 :添加好友 , 刪除好友 , 發(fā)送信息和退出系統(tǒng)等功能 [17]。 如圖 8 所示: XMPP 客戶端各項服務(wù)響應(yīng) 登錄之后的所有響應(yīng)由相應(yīng)模塊處理 , 解析從服務(wù)器接收到的 XML 流 , 同時顯示相應(yīng)的消息和信息提示 ,實現(xiàn)查看即時消息、好友列表顯示、好友上下線通知 。 如下圖 9所示 : 登錄或注冊成功 出現(xiàn)用戶主窗體 添加好友 刪除好友 發(fā)送信息 設(shè)置狀態(tài) 將信息合成 XML 流發(fā)送 圖 8 客戶端各項服務(wù)請求流程 圖 22 同時,要 將 要 發(fā)給服務(wù)器的消息打包成符合 XMPP 協(xié)議的 XML 流, 以發(fā)送給服務(wù)器,實現(xiàn)查找好友、添加好友、刪除好友等功能請求。 根據(jù) XML 流中的不同名字空間,調(diào)用不同的處理模塊 接收 XML 流 解釋 XML 流 驗證 好友列表 查找好友 添加好友 刪除好友 查看即時消息 上下線通知 圖 9 XMPP 客戶端各項服務(wù)響應(yīng)流程圖 23 5 XMPP 客戶端的詳細(xì)設(shè)計 XMPP 客戶端 總體通訊流程 XMPP 協(xié)議所開發(fā)的即時通訊客戶端軟件與服務(wù)器間的 XML通訊流程為 :客戶端連接服務(wù)器返回連接成功信息 , 表明用戶成功登錄。此時 , 用戶向好友發(fā)送在線即時消息 ,好友對消息內(nèi)容進(jìn)行回復(fù)。對話結(jié)束后 , 用戶向服務(wù)器提出退出系統(tǒng)的申請 , 連接和會話關(guān)閉 [18]。 本客戶端的總體流程圖如圖 10 所示: 開始 連接服務(wù)器 登錄 注冊 成功 設(shè)置在線狀態(tài) 獲取好友列表 開始監(jiān)聽端口 退出登錄 用戶交互 監(jiān)聽端口 添加好友 刪除好友 處理消息 查看信息 發(fā)送信息 有消息 有操作 發(fā)送 XML 消息 空信息 有信息 顯示好友上下線 提示好友添加邀請 提示好友拒絕邀請 提示好友添加失敗 提醒收到消息 接收 消息 解釋 消息 退出 顯示消息 是 是 否 是 重新 登錄 成功 重新 注冊 失敗 失敗 失敗 成功 成功 圖 10 客戶端總體流程圖 24 在這個過程中 , 用戶要首先登錄服務(wù)器 , 完成相關(guān)的安全驗證 , 當(dāng)?shù)卿浲瓿梢院?,與好友之間的通訊則不需要經(jīng)過服務(wù)器的中轉(zhuǎn) , 而是直接通過兩個客戶端之間點對點的通訊來完 成 , 這樣服務(wù)器只需要對用戶進(jìn)行基本資料和好友列表的管理和維護(hù) , 而用戶之間繁重的信息傳送則不需要由服務(wù)器端來負(fù)擔(dān) , 這樣的以服務(wù)器為中心的點對點的系統(tǒng)架構(gòu) , 大大減輕了服務(wù)器端所承受的負(fù)擔(dān) , 由此使得通訊更加的順暢。 XMPP 客戶端的主要功能 用戶注冊服務(wù)設(shè)計 用戶注冊服務(wù)負(fù)責(zé)新用戶的注冊處理。該服務(wù)需要用戶在客戶端 注冊對話框里 填寫用戶名、密碼、電子郵件 、 XMPP 服務(wù)器 等信息 , 當(dāng)用戶通過客戶端將這些信息提交給服務(wù)器的時候 , 服務(wù)器會查找該用戶名是否已經(jīng)存在于數(shù)據(jù)庫 , 從而防止同一用戶名重復(fù)出現(xiàn)的現(xiàn)象。 當(dāng)服務(wù)器發(fā)現(xiàn)注冊用戶選擇的用戶名已經(jīng)存在 , 服務(wù)器將會把該錯誤信息發(fā)回給客戶端 , 提醒用戶重新選擇用戶名進(jìn)行注冊。如果沒出現(xiàn)任何錯誤的話 , 服務(wù)器將用戶輸入的信息添加到數(shù)據(jù)庫中 , 然后發(fā)回注冊成功的信息給客戶端。 運(yùn)用 Smack API 包實現(xiàn)用戶注冊功能 , JAVA 代碼如下: 下面是從 XML 流的角度來剖析這一個注冊動作: [12] ◆ 客戶端 : 客戶端向服務(wù)器請求建立連接。用戶通過開戶一個從客戶端到服務(wù) 器端的 XML 流 ,來申請一個在服務(wù)器上的 socket 連接。其中 version=??代表客戶端所使用的 XMPP 的版本。 private XMPPConnection connection = null。 connConfig = new ConnectionConfiguration(serverIp, 5222)。 connection = new XMPPConnection(connConfig)。 ()。 ().createAccount(username, password)。 ?xml version=??? stream:stream to=, xmlns=?jabber:client? xmlns:stream=? xml:lang=?en? version=?? 25 ◆ 服務(wù)器: 服務(wù)器響應(yīng)連接 , 通過開啟一個從服務(wù)器到客戶端的 XML 流進(jìn)行回復(fù)。 ◆ 服務(wù)器 : 服務(wù)器返回支持的驗證方式。 ◆ 客戶端 : 客戶端發(fā)送一個注冊新用戶的請求。 ◆ 服務(wù)器 : 服務(wù)器返回用戶注冊是所要用到的字段和注冊提示信息。 ◆ 客戶端 : iq id=?uid1? type=?get? query xmlns=?jabber:iq:register?/ /iq stream:feature sxmlns:stream=? mechanism sxmlns=?urn:ietf:params:xml:ns:xmppsasl? mechanismDIGESTMD5meehanism mechanismPLAIN/ mechanism /mechanisms /stream:features ?xml version=? ?? stream:stream xmlns:stream=? xmlns=?jabber:elient? from=?? Version=? ? id=?7mh6bxa8x95jslubvkxyuPysze2xPz6jhxtrzzPq? iq xmlns=?jabber:client? id=?uid1?type=?result? query xmlns=?jabber:iq:register? username/ Password/ instructions Enter a username and Password to register With this server /instructions /query iq 26 用戶提供一個需要注冊一個 賬 號 (理論上 , 這需要一個不同的順序 :首先詢問服務(wù)器需要什么信息 , 然后服 務(wù)器 告知客戶端需要什么樣的信息 ; 但在實際中 , 假定需要的信息是 :用戶名 , 資源 , 密碼 )的信息。 ◆ 服務(wù)器 : 服務(wù)器返回注冊結(jié)果 , 表示已經(jīng)注冊成功。 ◆ 客戶端 UI 界面如 圖 11 所示 : 在用戶操作上 , 還實現(xiàn)了注冊密碼不一致的提示 。 登錄 驗證服務(wù)設(shè)計 登錄驗證服務(wù)是對試圖登錄的客戶端進(jìn)行權(quán)限驗證。驗證過程為 :服務(wù)器獲得客戶端發(fā)送來的用戶名和密碼 , 然后查詢數(shù)據(jù)庫的相應(yīng)的用戶列表 , 如果該用戶不存在或用戶名與密碼不匹配服務(wù)器將驗證失敗的結(jié)果通過 XMPP 協(xié)議發(fā)還給客戶端 , 驗證過程中止。如果驗證通過 , 登錄驗證服務(wù)會將數(shù)據(jù)庫中的用戶狀態(tài)由離線轉(zhuǎn)變?yōu)樵诰€ , 然后將驗證成功的結(jié)果發(fā)還給客戶端。對于客戶端而言 , 就是要向服務(wù)器發(fā)出連接請求 , 建立連接后發(fā)送登錄請求 , 等待服務(wù)器回應(yīng) , 發(fā)送登 錄所需驗證信息 , 再根據(jù)服務(wù)器端返回的 XML流判斷是否登錄成功。 運(yùn)用 Smack API 包實現(xiàn)用戶登錄功能 , JAVA 代碼如下: iq xmlns=?jabber:client?id=?uid2?type=?result?/ iq id=?uid2?type=?set? query xmlns=?jabber:iq:register? usernametest3/username password1234password /query /iq 圖 11 客戶端注冊界面 27 下面是從 XML 流的角度來剖析這一個登錄動作 [16]: ◆ 客戶端 : 用戶詢問服務(wù)器 , 登陸所需要提供的信息。 ◆ 服務(wù)器 : 服務(wù)器提示用戶登陸所需要的信息。 ◆ 客戶端 : XMPP 用戶提供所需的信息 — 在本例中 , 是一個 hash/元素 , 它是對信息進(jìn)行一個零度知識認(rèn)證的一個哈希。 ◆ 服務(wù)器 : 服務(wù)器響應(yīng)一個空的類型為 ?result?的 iq 元素 , 表明登陸成功。 (username, password)。 iq id=?2?type=?result?/ iq id=?2?type=?set? query xmlns=?jabber:iq:auth? usernameJuliet/username resourcebaleony/resource hash77d7eaede5e56b9622d0a075eb8836lbl10fogd7/hash /query /iq iq id=?l?type=?result? query xmlns=?jabber:iq:auth? usernameJuliet/username password/ digest/ sequence500sequence/ token3B905BFD/token resource/ /query /iq iq id=?l?type=?get? query xmlns=?jabber:iq:auth? usernameJuliet/username /query /iq 28 ◆ 客戶端 : 用戶發(fā)送當(dāng)前狀態(tài)給服務(wù)器 , 表明其在線。 ◆ 客戶端 UI 界面如 圖 12 所示 : 好友花名冊服務(wù)設(shè)計 好友花名冊服務(wù)是在用戶 登錄到服務(wù)器上后即刻發(fā)生的服務(wù) , 此服務(wù)的目的通過查詢得到自己的好友花名冊列表 (包括其好友的在線狀態(tài) )。服務(wù)器以登錄用戶的 JID 為參數(shù)在好友列表 (FriendList)查找其好友的 JID。然后根據(jù)查詢數(shù)據(jù)庫得到的好友信息結(jié)果中的好友 JID, 查詢他們的在線狀態(tài) , 然后將這些信息組合成 XMPP 協(xié)議的 XML 流返回給用戶。用戶將好友及其狀態(tài)列表在客戶端顯示出來。 運(yùn)用 Smack API 包實現(xiàn)用戶 好友列表的獲取 功能 , JAVA 代碼如下: TreeMapString , FriendBean groupFriendInfo = new TreeMapString , FriendBean()。 roster = ()。 String jId = 。 for (RosterEntry entry : ()) { FriendBean fb = new FriendBean()。 (().iterator().next().getName())。 (())。 (jId = ())。 (false)。 ()。 (jId, fb)。 } 圖 12 客戶端登錄界面 presence statusOnline/status /presence 29 客戶端 設(shè)計了一個實體類 FriendBean, 用來保存在服務(wù)器獲取回來的每個好友的相關(guān)信息 , group 為好友所在分組、 nickName 為好友昵稱、 JId 為好友的 JID、 dialogOpened表示是否與該好友聊天、 status 表示好友的在線狀態(tài);這里的 groupFriendInfo 為一個TreeMap 結(jié)構(gòu)的好友列表 , TreeMap 為紅黑樹的 JAVA 實現(xiàn) , 詳細(xì)介紹見 ( 好友列表數(shù)據(jù)的處理
點擊復(fù)制文檔內(nèi)容
研究報告相關(guān)推薦
文庫吧 www.dybbs8.com
備案圖鄂ICP備17016276號-1