




版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、本科生畢業(yè)論文題 目:分如式網(wǎng)絡(luò)中的推送系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)院 系:軟件學(xué)院專(zhuān) 業(yè):軟件丁程(計(jì)算機(jī)應(yīng)用方向)學(xué)生姓名:學(xué) 號(hào)指導(dǎo)教師:(職稱(chēng))隨著互聯(lián)網(wǎng)計(jì)算機(jī)技術(shù)的飛速發(fā)展,網(wǎng)絡(luò)己經(jīng)成了大眾生活必不可少的部分, 它的最大優(yōu)點(diǎn)就是可以將大量的信息互相共享。不管是移動(dòng)終端還是個(gè)人電腦,人們 總是可以通過(guò)設(shè)備進(jìn)入互聯(lián)網(wǎng)中獲得自己感興趣的信息。但與此同時(shí),由于互聯(lián)網(wǎng)是屬于大家的,具有很強(qiáng)的開(kāi)放性,使得網(wǎng)絡(luò)上的信 息每天都在呈爆炸式地增長(zhǎng),信息的泛濫而引起網(wǎng)民難以消化的現(xiàn)象已經(jīng)不再是新鮮 事。在當(dāng)今這個(gè)步伐急促的社會(huì)屮,要想通過(guò)普通瀏覽的方式在信息海洋小找到自己 所需要的內(nèi)容確實(shí)不是一件輕松的事,普通的瀏
2、覽查找在當(dāng)今己經(jīng)可以說(shuō)得上是一種 既消耗精力又浪費(fèi)吋間的信息獲取方式,在注重用戶(hù)體驗(yàn)的今天,它已經(jīng)很難達(dá)用戶(hù) 滿(mǎn)意程度。為了給各位網(wǎng)民帶來(lái)具有針對(duì)性的個(gè)性化服務(wù),將方便快捷的體驗(yàn)帶給網(wǎng)民, 信息推送技術(shù)(push)應(yīng)運(yùn)而生。有了 push技術(shù),用戶(hù)再也不用手動(dòng)地在互聯(lián)網(wǎng) 上查找自c想要的信息,而只需設(shè)置訂閱自己所感興趣的內(nèi)容,push系統(tǒng)就會(huì)定期 地向用戶(hù)推送相關(guān)消息,整個(gè)過(guò)程中用戶(hù)處于被動(dòng)狀態(tài),省去了手動(dòng)查找等繁朵步驟, 大大提高了用戶(hù)的體驗(yàn)質(zhì)量。因此,推送技術(shù)已經(jīng)在近些年中得到了巨大的發(fā)展和推廣,尤其是在當(dāng)今分布 式主流的網(wǎng)絡(luò)屮,一個(gè)好的推送系統(tǒng)會(huì)給成千上萬(wàn)的用戶(hù)帶來(lái)便利,也給了各個(gè)消息
3、發(fā)送方帶來(lái)了推廣渠道。通過(guò)推送系統(tǒng),各個(gè)組織可以把自己的新聞消息推送到特定 用戶(hù)的設(shè)備中,形成了定向傳送的局面,雙方的需求都得到了滿(mǎn)足,并h還有了效率 的保證。關(guān)鍵詞:信息獲取,推送技術(shù),個(gè)性化abstractwith the rapid development of the technology in internet and computer field, network has become the indispensable part of the public life. its most important advantage is the capacity of sharing
4、lots of message. w讓h mobile terminal or pc, people can easily connect to the internet to get the message he/she like.but in the same time, since the internet belongs to ourselves, it is so open that the messages in internet are increasing rapidly everyday it is no more a news that netizen can not di
5、gest soon because of the message overflow. in this hurried society, it is not an easy thing to find the message we want in the data ocean by ordinary browsing. nowaday the ordinary browsing way is time-wasted and vigor-wasted to get message. from point view of paying attention to customer experience
6、, it can hardly make the customer satisfied.to give the netizen individual service and convenient experience, the message push technology occurs. with the push technology, customers no more need to find the message manually. they just need to setup the content they interest in, and the push system w
7、ill push the relevant message to the customer. the customers are in passive state all the time without the manual checking, and the customer experience is enhancing largely.so the push technology has been popularized and developed largely these years, especially in the distributed network. an excell
8、ent push system can bring convenience to customers and provide more spread way to the pushers- with the push system, an organization can send their news to the specific customers. it satisfy the pushers and recievers in the same time and guarantee the efficiency.keywords: obtain message, push techno
9、logy, individuation第一章前言1l1背景現(xiàn)狀分析11.2推送系統(tǒng)概述21.3論文結(jié)構(gòu)簡(jiǎn)介3笫二章技術(shù)與原理42推送基木原理42.2 push技術(shù)優(yōu)缺點(diǎn)分析52.3 java網(wǎng)絡(luò)編程62.4 java數(shù)據(jù)庫(kù)編程11241 jdbc 簡(jiǎn)介112.4.2 java數(shù)據(jù)庫(kù)操作122.5 xmpp協(xié)議介紹17第三章架構(gòu)設(shè)計(jì)193系統(tǒng)架構(gòu)及原理193.2業(yè)務(wù)用例的實(shí)現(xiàn)203.3數(shù)據(jù)庫(kù)設(shè)計(jì)223.3.1構(gòu)建數(shù)據(jù)庫(kù)的系統(tǒng)流程223.3.2表的貝體設(shè)計(jì)24第四章模塊設(shè)計(jì)284.1 connectionpool 類(lèi)介紹284.2 cache 類(lèi)介紹384.3 onlinemanager 類(lèi)介紹4
10、34.4 logei類(lèi)介紹48第五章部署應(yīng)用525運(yùn)行環(huán)境525.2使用說(shuō)明53第六章結(jié)論576工作總結(jié)576.2工作展望58致謝59參考文獻(xiàn)60第一章前言1.1背景現(xiàn)狀分析pull與push技術(shù)對(duì)用戶(hù)來(lái)說(shuō)都是信息獲取方式,但卻是兩種截然相反的信 息獲取技術(shù)。pull為信息拉取技術(shù),在信息獲取時(shí),用戶(hù)必須時(shí)時(shí)處于主動(dòng)地位, 并冃參與信息獲取整個(gè)過(guò)程;push技術(shù)為信息推送技術(shù),服務(wù)器處丁主動(dòng)地位, 用戶(hù)處于被動(dòng)地位。通常情況下,人們都是采用“pull”方式從網(wǎng)絡(luò)上“拉取”信息,即利用搜 索引擎來(lái)獲取信息的方式。隨著網(wǎng)絡(luò)上信息資源的日益豐富,基于pull技術(shù)的 信息獲取技術(shù)無(wú)論在信息的搜索速度、
11、傳輸速度,還是搜索信息的質(zhì)量上都越來(lái) 越難以令人滿(mǎn)意。這是由于pull技術(shù)自身存在的不足造成的。一是以pull方式 獲取信息不僅時(shí)間長(zhǎng),而且費(fèi)用高。pull技術(shù)是通過(guò)url來(lái)進(jìn)行信息資源定位 的。人們上網(wǎng)獲取信息時(shí),必須首先利用各種搜索引擎去查找各個(gè)服務(wù)器在網(wǎng)上 的url,然后再通過(guò)url去訪問(wèn)該服務(wù)器,定位、瀏覽、選擇自己所需的信息 資源。這樣人們查詢(xún)一次信息,必須長(zhǎng)時(shí)間地頻繁登錄多個(gè)服務(wù)器,i大i而不僅時(shí) 間長(zhǎng),而冃費(fèi)用高。二是信息效率低,資源浪費(fèi)嚴(yán)重。從網(wǎng)絡(luò)技術(shù)上講,pull技 術(shù)是一種點(diǎn)到點(diǎn)的傳輸方式,當(dāng)多個(gè)用戶(hù)需要一條信息時(shí),該信息就必須重復(fù)傳 輸多次,因此嚴(yán)重地浪費(fèi)了網(wǎng)絡(luò)帶寬和服務(wù)
12、器資源。三是服務(wù)器被動(dòng)服務(wù),用戶(hù) 獲取信息及時(shí)性差。pull方式獲取信息時(shí),用戶(hù)是主動(dòng)的,服務(wù)器和信息是被動(dòng) 的,也就是說(shuō),用戶(hù)必須主動(dòng)到服務(wù)器上尋找信息,這就是人們通常所說(shuō)的“人 找信息”。另外,這種方式客戶(hù)機(jī)和服務(wù)器必須保持實(shí)時(shí)的連接才能獲取信息。 但由于網(wǎng)絡(luò)信息更新快,這就要求用戶(hù)必須經(jīng)常上網(wǎng)查看信息,否則很難及時(shí)獲 得自c所需的最新信息。簡(jiǎn)單地說(shuō),internet發(fā)展到今天的規(guī)模,網(wǎng)上具有海量信息,這種依靠被動(dòng) “拉取”信息的服務(wù)方式,在時(shí)間延遲、查全率、查準(zhǔn)率、響應(yīng)時(shí)間等方面都不 能滿(mǎn)足用戶(hù)的需求,可以說(shuō),以pull技術(shù)為代表的信息獲取模式已成為信息共 享的瓶頸。pull與push技
13、術(shù)對(duì)用戶(hù)來(lái)說(shuō)都是信息獲取技術(shù),但二者存在著根本的不同。 以pull技術(shù)為核心的信息拉取技術(shù),在信息獲取時(shí),用戶(hù)必須時(shí)時(shí)處于主動(dòng)地 位,也就是說(shuō),用戶(hù)必須參與信息獲取的整個(gè)過(guò)程。而以push技術(shù)為核心的信 息推送技術(shù),在信息推送過(guò)程屮,服務(wù)器始終處于主動(dòng)地位,用戶(hù)卻處于被動(dòng)地 位。與pull技術(shù)相比,push技術(shù)不僅獲取信息的效率高,費(fèi)用低,而且及時(shí)性 強(qiáng),因而它一出現(xiàn)便受到人們的青睞。push技術(shù)能夠通過(guò)一定的技術(shù)標(biāo)準(zhǔn)或協(xié) 議,把用戶(hù)感興趣的信息,按照用戶(hù)的要求及吋、主動(dòng)地推送給用戶(hù)。用戶(hù)收到 信息后,還可以離線(xiàn)瀏覽。信息推送技術(shù)將深刻地改變網(wǎng)絡(luò)信息的傳播方式,使 用戶(hù)不必“大海撈針”式地搜集
14、信息,而由服務(wù)器主動(dòng)、及時(shí)地把用戶(hù)感興趣的 信息推送給用戶(hù),用戶(hù)可以“以逸待勞”地坐等信息到來(lái)。1.2推送系統(tǒng)概述隨著互聯(lián)網(wǎng)越來(lái)越深入人心,網(wǎng)絡(luò)容量和瀏覽人數(shù)都以驚人的速度增長(zhǎng)著。 當(dāng)人們上網(wǎng)瀏覽資訊,而臨著數(shù)以百萬(wàn)計(jì)的網(wǎng)頁(yè),他們就更需要一種簡(jiǎn)便快速的 方法找到他們所需要的信息內(nèi)容。毫無(wú)疑問(wèn),推送系統(tǒng)將是一個(gè)很好的選擇,通 過(guò)這類(lèi)系統(tǒng),用戶(hù)可以全面、及時(shí)、準(zhǔn)確的獲得個(gè)人感興趣的內(nèi)容。我們來(lái)打個(gè)比方,推送系統(tǒng)好比一個(gè)傳遞信息中間者,它的一邊是發(fā)布方, 一邊是接受方,一旦發(fā)布方有了新的推送消息,它就立即將信息傳遞到特定的接 收方當(dāng)屮,將原來(lái)復(fù)雜繁瑣的步驟最簡(jiǎn)化,以捉高信息分享的效率。在推送系統(tǒng)的面
15、麗,人們只需耍做這幾件事,假如你是一個(gè)網(wǎng)民,你只需 要訂閱好你所感興趣的內(nèi)容,然后就可以悠哉的等待最新信息的到來(lái),想接受什 么消息和拒絕接受什么消息完全由用戶(hù)來(lái)決定,以此體現(xiàn)了個(gè)性化的用戶(hù)體驗(yàn); 接入你是一個(gè)組織,你想妾發(fā)布一些消息(如新聞、通知等),你只需要填寫(xiě)好 消息的內(nèi)容,推送系統(tǒng)的服務(wù)器就會(huì)自動(dòng)地將消息轉(zhuǎn)發(fā)推送到被訂閱的用戶(hù)去, 不必?fù)?dān)心用戶(hù)因?yàn)椴辉诰€(xiàn)而因此的消息推送失敗,對(duì)于沒(méi)在線(xiàn)的用戶(hù),服務(wù)器會(huì) 將消息保存下來(lái),等待用戶(hù)下一次上線(xiàn)再推送,整個(gè)過(guò)程方便保險(xiǎn)。1.3論文結(jié)構(gòu)簡(jiǎn)介本論文各章節(jié)內(nèi)容安排如下:第一章作為本論文的緒論,主要論述了消息推送技術(shù)的背景現(xiàn)況、推送系 統(tǒng)的概述,并簡(jiǎn)要介
16、紹了本文的結(jié)構(gòu)。第二章會(huì)把實(shí)現(xiàn)系統(tǒng)的技術(shù)原理進(jìn)行詳細(xì)的闡述,比如如何實(shí)現(xiàn)推送功能、 如何對(duì)在線(xiàn)用戶(hù)進(jìn)行管理、如何將信息中轉(zhuǎn)保存等等關(guān)鍵技術(shù)問(wèn)題,也會(huì)討論到 系統(tǒng)的運(yùn)行機(jī)制和一些用到的關(guān)鍵算法。第三章主要講述整個(gè)推送系統(tǒng)的框架設(shè)計(jì),該章首先會(huì)對(duì)系統(tǒng)進(jìn)行一個(gè)整 體化的分析論述,整體論述后還會(huì)對(duì)系統(tǒng)的各大模塊進(jìn)行功能性的介紹,并分析 其在整個(gè)系統(tǒng)中的重要性以及各個(gè)模塊之間是如何銜接起來(lái)支撐整個(gè)系統(tǒng)。第四章將會(huì)深入分析各個(gè)模塊的設(shè)計(jì)實(shí)現(xiàn)過(guò)程,剖析各模塊的內(nèi)部結(jié)構(gòu), 也講述到實(shí)現(xiàn)過(guò)程屮要注意的細(xì)節(jié)以及如何對(duì)模塊進(jìn)行優(yōu)化以保證系統(tǒng)的運(yùn)行 效率。第五章主要對(duì)消息推送系統(tǒng)的設(shè)計(jì)實(shí)現(xiàn)進(jìn)行一個(gè)整體總結(jié),并ii提出
17、本次 實(shí)踐當(dāng)中存在的一些局限性和有待改進(jìn)的地方。第二章技術(shù)與原理2.1推送基本原理盡管在定義上push方式的消息推送是由服務(wù)器占有主動(dòng)權(quán),終端用戶(hù)處于 被動(dòng)狀態(tài),但其實(shí)技術(shù)實(shí)現(xiàn)的背后還是基于“請(qǐng)求響應(yīng)”模式,在這模式上 做了一定修改。終端用戶(hù)一旦設(shè)置好自己的訂閱內(nèi)容,就不停“隱蔽”地向服務(wù) 器發(fā)送請(qǐng)求,而一旦服務(wù)器發(fā)現(xiàn)有新的消息需要推送,就給終端返回推送消息, 以此實(shí)現(xiàn)了推送的效果。在這里主要涉及到兩個(gè)方面,一個(gè)是輪詢(xún)時(shí)間,它代表 著終端訪問(wèn)服務(wù)器的時(shí)間間隔;另一個(gè)是服務(wù)器的請(qǐng)求處理方式,接收到來(lái)自終 端的請(qǐng)求后,服務(wù)器可以選擇掛起連接或者馬上返回消息給用戶(hù)。根據(jù)輪詢(xún)時(shí)間、請(qǐng)求處理方式,分為以
18、下兩種pusho簡(jiǎn)單輪詢(xún):客戶(hù)端一般以定時(shí)方式發(fā)起請(qǐng)求,服務(wù)端處理后返回響應(yīng)??蛻?hù)端定時(shí)進(jìn)行輪詢(xún), 間隔可配置t1.1:相應(yīng)2.1: 圖2.1簡(jiǎn)單輪詢(xún)?cè)硖攸c(diǎn):原理、客戶(hù)端/服務(wù)端實(shí)現(xiàn)簡(jiǎn)單可根據(jù)應(yīng)用場(chǎng)景調(diào)整輪詢(xún)時(shí)間間隔服務(wù)端需要處理大量請(qǐng)求長(zhǎng)輪詢(xún):客戶(hù)端發(fā)起請(qǐng)求后服務(wù)端將該請(qǐng)求掛起(不返回響應(yīng)),直到超吋、異?;?需要處理響應(yīng)(推內(nèi)容)才返冋??蛻?hù)端收到響應(yīng)后再次請(qǐng)求(即輪詢(xún))服務(wù)端, 并處理響應(yīng)。請(qǐng)求請(qǐng)求對(duì)y1.1:掛起請(qǐng)求消息服務(wù)監(jiān)聽(tīng)上、返冋響應(yīng) 后立即開(kāi) 始下一次 輪詢(xún)請(qǐng)求4:響應(yīng)4.1:請(qǐng)求2:處t3:獲取z前性起的請(qǐng)求圖2.1.2長(zhǎng)輪詢(xún)?cè)硖攸c(diǎn):實(shí)時(shí)性高服務(wù)端需要管理掛起請(qǐng)求2.2
19、push技術(shù)優(yōu)缺點(diǎn)分析push技術(shù)作為一種網(wǎng)絡(luò)信息獲取技術(shù)是成功的,它的好處町概括為:可以避免用戶(hù)在網(wǎng)上無(wú)口的上網(wǎng)查找,利用離線(xiàn)瀏覽技術(shù)使用戶(hù)可采用 離線(xiàn)方式進(jìn)行閱讀。可以捉高被推送信息的準(zhǔn)確性,控制搜索深度,過(guò)濾不必要的信息。能被推送的信息內(nèi)容有教學(xué)資料、新聞、電影、咅樂(lè)、房產(chǎn)信息、股市行情、共享軟件、天氣預(yù)報(bào)等。能被推送的文件有文字、圖形、圖像、聲咅、小程序等,并且可以超文 本或通過(guò)超文本訪問(wèn)的文件的形式保存在用戶(hù)的硬盤(pán)上??梢酝扑屯ㄟ^(guò)專(zhuān)用的播放程序?qū)崊硷@示的信息,向用戶(hù)提供多媒體信息。 push服務(wù)器能對(duì)各個(gè)用戶(hù)的興趣和偏好進(jìn)行智能性識(shí)別、預(yù)測(cè),根據(jù)用 戶(hù)要求自動(dòng)搜集定制信息并定期快速、
20、連續(xù)不斷地向目標(biāo)用戶(hù)主動(dòng)推送, 滿(mǎn)足了用戶(hù)的個(gè)性化需求。但同時(shí)也存在很多需要完善的地方:難以滿(mǎn)足用戶(hù)個(gè)性化的要求。push技術(shù)是按照預(yù)先確定的一系列標(biāo)準(zhǔn)來(lái)傳送 信息的,這種標(biāo)準(zhǔn)是建立在發(fā)送方和接收方之間的協(xié)議上,而不是以用戶(hù)需 求為基礎(chǔ)的。多數(shù)push產(chǎn)品針對(duì)性較差,滿(mǎn)足個(gè)性化程度不高,這在覆蓋 推送中表現(xiàn)尤為突出。未能解決信息過(guò)載問(wèn)題。push技術(shù)本來(lái)是為了解決因特網(wǎng)上信息過(guò)載而出現(xiàn) 的新技術(shù),然而結(jié)果事與愿違。如果push產(chǎn)品大量使用,反而會(huì)加重網(wǎng)絡(luò) 信息過(guò)載。數(shù)據(jù)風(fēng)暴問(wèn)題?!巴扑图夹g(shù)”與過(guò)去常用的“拉取技術(shù)”的顯著不同是:拉 取是由用戶(hù)來(lái)控制信息的檢索與獲取,用戶(hù)是主動(dòng)的。而推送技術(shù)則考
21、慮由 其他方來(lái)控制信息的傳送。當(dāng)信息捉供商將大量信息強(qiáng)制性地推向用戶(hù)時(shí), 便會(huì)將用戶(hù)淹沒(méi)于“信息垃圾”中。網(wǎng)絡(luò)帶寬浪費(fèi)問(wèn)題。push技術(shù)為網(wǎng)絡(luò)帶來(lái)新的服務(wù)模型的同時(shí)也引起了帶寬 浪費(fèi)問(wèn)題,這主要是由push服務(wù)器主動(dòng)發(fā)送大量信息或客戶(hù)代理自動(dòng)進(jìn)行 站點(diǎn)搜索所造成的。因此,push產(chǎn)品必須考慮如何有效地利用帶寬,這將是 決定該項(xiàng)技術(shù)前景的關(guān)鍵。2.3 java網(wǎng)絡(luò)編程木推送系統(tǒng)主要使用java語(yǔ)言實(shí)現(xiàn),因此java的網(wǎng)絡(luò)編程在本項(xiàng)口屮占有很 大比重,而網(wǎng)絡(luò)編程木來(lái)就是開(kāi)發(fā)者的必備技術(shù)z,接下來(lái)本節(jié)會(huì)簡(jiǎn)單介紹一 下網(wǎng)絡(luò)編程以及java本身網(wǎng)絡(luò)編程的一些技巧。從通俗的角度上來(lái)說(shuō),網(wǎng)絡(luò)編程就是指通過(guò)程
22、序?qū)?shù)據(jù)從一臺(tái)網(wǎng)絡(luò)設(shè)備上傳 輸?shù)搅硪慌_(tái)設(shè)備之中去,而上述所說(shuō)的程序?qū)嶋H上就是指服務(wù)程序和客戶(hù)端,毎 一次的數(shù)據(jù)連接都是由一方提出請(qǐng)求,等另一方確認(rèn)接受之后才會(huì)得以進(jìn)行,并 且客戶(hù)端程序就是提出請(qǐng)求的一方,服務(wù)器就是被請(qǐng)求然后確認(rèn)接受的一方。在講解網(wǎng)絡(luò)傳送的原理之前,我們需要理解兩個(gè)概念,一個(gè)是ip地址,一 個(gè)是端口號(hào)。ip地址是一個(gè)32位的二進(jìn)制序列,通常被分割成四個(gè)八位的二進(jìn)制數(shù),它 好比是一臺(tái)電話(huà)的電話(huà)號(hào)碼,用來(lái)識(shí)別出互聯(lián)網(wǎng)中的唯一設(shè)備,正是冇了這個(gè)唯 一的標(biāo)識(shí),我們才可以在千千萬(wàn)萬(wàn)臺(tái)設(shè)備中將數(shù)據(jù)方便快捷的傳輸?shù)轿覀兊哪康?主機(jī)中去。而端口號(hào)是用來(lái)識(shí)別數(shù)一臺(tái)主機(jī)屮的一個(gè)服務(wù),也就是一個(gè)程序
23、,每個(gè)程序 都有口己的端口號(hào),知道了端口號(hào)之后數(shù)據(jù)達(dá)到主機(jī)后就可以根據(jù)端口號(hào)分配到 目的程序屮去,以保證數(shù)據(jù)不會(huì)被其它服務(wù)所接收。所以,通過(guò)ip地址/端口號(hào),我們就可以識(shí)別出網(wǎng)絡(luò)中的唯一服務(wù),實(shí)現(xiàn)雙 方的連接和數(shù)據(jù)的傳送。盡管數(shù)據(jù)的傳送是建立在ip地址/端口號(hào)對(duì)之上,但傳送的方式根據(jù)其機(jī)制 的不同也分為多利而當(dāng)今網(wǎng)絡(luò)連接協(xié)議主要分為兩大類(lèi):tcp協(xié)議以及udp 協(xié)議。tcp是一種面向連接的協(xié)議,言下z意就是在數(shù)據(jù)傳送2而設(shè)備z間必須先 建立好可靠安全的連接,而每一次的連接必須雙方完成了 “三次握手”之后才能 得以進(jìn)行,即雙方事前必須經(jīng)過(guò)三重確認(rèn)后才可以傳輸數(shù)據(jù)。另夕卜,tcp連接是 一種安全的
24、連接,它保證數(shù)據(jù)一定會(huì)傳送到目的地,如果數(shù)拯在傳輸過(guò)程中意外 丟失,它會(huì)通過(guò)一系列的機(jī)制進(jìn)行重發(fā),并且設(shè)冇阻塞機(jī)制以保證網(wǎng)絡(luò)的穩(wěn)定性, 常見(jiàn)的tcp協(xié)議有http協(xié)議、ftp協(xié)議等等。udp是一種無(wú)連接協(xié)議,即在傳送數(shù)據(jù)之前并不需要建立一個(gè)傳輸通道,而 是從程序屮獲取到所要發(fā)送的數(shù)據(jù),隨后將之“扔”到網(wǎng)絡(luò)屮,整個(gè)過(guò)程并不需 要維護(hù)一個(gè)數(shù)據(jù)的連接狀態(tài),它使用的是最大交付方式,即不保證數(shù)拯能準(zhǔn)確地 傳輸?shù)侥康某绦虍?dāng)中,但因?yàn)椴辉O(shè)有阻塞機(jī)制,因此速度會(huì)相對(duì)tcp連接快, 適用于一些流媒體或語(yǔ)音數(shù)據(jù)等傳輸,平時(shí)我們使用的“ping”命令就是對(duì)目標(biāo) 主機(jī)發(fā)送udp協(xié)議數(shù)據(jù)包以測(cè)試當(dāng)前網(wǎng)絡(luò)是否通行。簡(jiǎn)單介
25、紹完一些關(guān)于網(wǎng)絡(luò)編程的概念之后,接下來(lái)談一下現(xiàn)實(shí)java網(wǎng)絡(luò)編程 中的實(shí)際方法,由于本推送系統(tǒng)使用的是tcp協(xié)議,因此下而我們暫時(shí)不探討 java網(wǎng)絡(luò)編程中udp連接的實(shí)現(xiàn)。在java語(yǔ)言中,對(duì)于tcp方式的網(wǎng)絡(luò)編程提供了良好的支持,在實(shí)際實(shí)現(xiàn) ii寸,以.socket類(lèi)代表客戶(hù)端連接,以.serversocket類(lèi)代表服務(wù)器 端連接。在進(jìn)行網(wǎng)絡(luò)編程時(shí),底層網(wǎng)絡(luò)通訊的細(xì)節(jié)已經(jīng)實(shí)現(xiàn)了比較高的封裝,所 以在程序員實(shí)際編程時(shí),只需要指定ip地址和端口號(hào)碼就可以建立連接了。正 是由于這種高度的封裝,一方面簡(jiǎn)化了 java語(yǔ)言網(wǎng)絡(luò)編程的難度,另外也使得 使用java語(yǔ)言進(jìn)行網(wǎng)絡(luò)編程時(shí)無(wú)法深入到網(wǎng)絡(luò)的底層
26、,所以使用java語(yǔ)言進(jìn)行 網(wǎng)絡(luò)底層系統(tǒng)編程很困難,具體點(diǎn)說(shuō),java語(yǔ)言無(wú)法實(shí)現(xiàn)底層的網(wǎng)絡(luò)嗅探以及獲 得ip包結(jié)構(gòu)等信息。但是由于java語(yǔ)言的網(wǎng)絡(luò)編程比較簡(jiǎn)單,所以還是獲得了 廣泛的使用。卜面分別介紹一下在java語(yǔ)言中客戶(hù)端和服務(wù)器端的實(shí)現(xiàn)步驟。在客戶(hù)端網(wǎng)絡(luò)編程中,首先需要建立連接,在java api中以.socket 類(lèi)的對(duì)象代表網(wǎng)絡(luò)連接,所以建立客戶(hù)端網(wǎng)絡(luò)連接,也就是創(chuàng)建socket類(lèi)型的 對(duì)彖,該對(duì)彖代表網(wǎng)絡(luò)連接,示例如下:socket socket 1 = new socket( u 00,10000);socket socket2 = new sock
27、et( “'' ,80);上面的代碼中,socketl實(shí)現(xiàn)的是連接到ip地址是00的計(jì)算機(jī) 的10000號(hào)端口,iflj socket2實(shí)現(xiàn)的是連接到域名是的計(jì)算機(jī)的 80號(hào)端i,至于底層網(wǎng)絡(luò)如何實(shí)現(xiàn)建立連接,對(duì)于程序員來(lái)說(shuō)是完全透明的。 如果建立連接時(shí),本機(jī)網(wǎng)絡(luò)不通,或服務(wù)器端程序未開(kāi)啟,則會(huì)拋出異常。連接一旦建立,則完成了客戶(hù)端編程的第一步,緊接著的步驟就是按照“請(qǐng) 求響應(yīng)”模型進(jìn)行網(wǎng)絡(luò)數(shù)據(jù)交換,在java語(yǔ)言中,數(shù)據(jù)傳輸功能由jaw 10實(shí) 現(xiàn),也就是說(shuō)只需耍從連接中獲得輸入流和輸出流即可,然后將需要發(fā)送的數(shù)據(jù) 寫(xiě)入連接對(duì)象的輸出流中,在發(fā)送完成
28、以后從輸入流中讀取數(shù)據(jù)即可。示例代碼 如下:outputstream os = socket 1 .getoutputstream(); 獲得輸岀流 inputstream is = socket 1 .getinputstream();獲得輸入流上面的代碼屮,分別從socket 1這個(gè)連接對(duì)象獲得了輸出流和輸入流對(duì)象, 在整個(gè)網(wǎng)絡(luò)編程中,后續(xù)的數(shù)據(jù)交換就變成了 10操作,也就是遵循“請(qǐng)求響應(yīng)” 模型的規(guī)定,先向輸岀流中寫(xiě)入數(shù)據(jù),這些數(shù)據(jù)會(huì)被系統(tǒng)發(fā)送岀去,然后在從輸 入流中讀取服務(wù)器端的反饋信息,這樣就完成了一次數(shù)據(jù)交換過(guò)程,當(dāng)然這個(gè)數(shù) 據(jù)交換過(guò)程可以多次進(jìn)行。這里獲得的只是最基木的輸出流和輸
29、入流對(duì)象,還可以根據(jù)前面學(xué)習(xí)到的10 知識(shí),使用流的嵌套將這些獲得到的基本流對(duì)象轉(zhuǎn)換成需要的裝飾流對(duì)象,從而 方便數(shù)據(jù)的操作。最后當(dāng)數(shù)據(jù)交換完成以后,關(guān)閉網(wǎng)絡(luò)連接,釋放網(wǎng)絡(luò)連接占用的系統(tǒng)端ii和 內(nèi)存等資源,完成網(wǎng)絡(luò)操作,示例代碼如下:socket l.close();介紹完一個(gè)簡(jiǎn)單的客戶(hù)端編程的示例,下面接著介紹一 ftcp類(lèi)型的服務(wù)器 端的編寫(xiě)。首先需要說(shuō)明的是,客戶(hù)端的步驟和服務(wù)器端的編寫(xiě)步驟不同,所以 在學(xué)習(xí)服務(wù)器端編程吋注意不要和客戶(hù)端混淆起來(lái)。在服務(wù)器端程序編程中,由于服務(wù)器端實(shí)現(xiàn)的是被動(dòng)等待連接,所以服務(wù)器 端編程的第一個(gè)步驟是監(jiān)聽(tīng)端口,也就是監(jiān)聽(tīng)是否冇客戶(hù)端連接到達(dá)。實(shí)現(xiàn)服務(wù)
30、器端監(jiān)聽(tīng)的代碼為:serversocket ss = new serversocket( 10000);該代碼實(shí)現(xiàn)的功能是監(jiān)聽(tīng)當(dāng)前計(jì)算機(jī)的10000號(hào)端口,如果在執(zhí)行該代碼時(shí),10000號(hào)端口已經(jīng)被別的程序占用,那么將拋出異常。否則將實(shí)現(xiàn)監(jiān)聽(tīng)。服務(wù)器端編程的第二個(gè)步驟是獲得連接。該步驟的作用是當(dāng)冇客戶(hù)端連接到 達(dá)吋,建立一個(gè)和客戶(hù)端連接對(duì)應(yīng)的socket連接對(duì)象,從而釋放客戶(hù)端連接對(duì) 于服務(wù)器端端口的占用。實(shí)現(xiàn)功能就像公司的前臺(tái)一樣,當(dāng)一個(gè)客戶(hù)到達(dá)公司時(shí), 會(huì)告訴前臺(tái)我找某某某,然后前臺(tái)就通知某某某,然后就可以繼續(xù)接待其它客 戶(hù)了。通過(guò)獲得連接,使得客戶(hù)端的連接在服務(wù)器端獲得了保持,另外使得服
31、務(wù) 器端的端口釋放出來(lái),可以繼續(xù)等待其它的客戶(hù)端連接。實(shí)現(xiàn)獲得連接的代碼 是:socket socket = ss.accept();該代碼實(shí)現(xiàn)的功能是獲得當(dāng)而連接到服務(wù)器端的客戶(hù)端連接。需耍說(shuō)明的是 accept是一個(gè)阻塞方法,也就是當(dāng)無(wú)連接時(shí),該方法將阻塞程序的執(zhí)行,直到連 接到達(dá)吋才執(zhí)行該行代碼。另外獲得的連接會(huì)在服務(wù)器端的該端口注冊(cè),這樣以 后就可以通過(guò)在服務(wù)器端的注冊(cè)信息直接通信,而注冊(cè)以后服務(wù)器端的端口就被 釋放出來(lái),又可以繼續(xù)接受其它的連接了。連接獲得以后,后續(xù)的編程就和客戶(hù)端的網(wǎng)絡(luò)編程類(lèi)似了,這里獲得的socket 類(lèi)型的連接就和客戶(hù)端的網(wǎng)絡(luò)連接一樣了,只是服務(wù)器端需要首先讀取
32、發(fā)送過(guò)來(lái) 的數(shù)據(jù),然后進(jìn)行邏輯處理以后再發(fā)送給客戶(hù)端,也就是交換數(shù)據(jù)的順序和客戶(hù) 端交換數(shù)據(jù)的步驟剛好相反。這部分的內(nèi)容和客戶(hù)端很類(lèi)似,所以就不重復(fù)了。最后,在服務(wù)器端通信完成以后,關(guān)閉服務(wù)器端連接。實(shí)現(xiàn)的代碼為:ss.close();綜上所述,java網(wǎng)絡(luò)編程步驟大概可以概描為如下圖:圖2.3.1網(wǎng)絡(luò)編程流程2.4 java數(shù)據(jù)庫(kù)編程推送系統(tǒng)服務(wù)器可能會(huì)而臨著大量數(shù)據(jù)的存儲(chǔ)和轉(zhuǎn)發(fā),也會(huì)包括一系列的事 務(wù)操作,因此系統(tǒng)需要數(shù)據(jù)庫(kù)的技術(shù)支持來(lái)保證運(yùn)作的效率。木推送系統(tǒng)使用了 mysql數(shù)據(jù)庫(kù)來(lái)維護(hù)數(shù)據(jù),下面會(huì)介紹一下java語(yǔ)言中數(shù)據(jù)庫(kù)的使用技巧。2.4.1 jdbc 簡(jiǎn)介jdbc (java
33、data base connectivityjava 數(shù)據(jù)庫(kù)連接)是一種用于執(zhí)行 sql 語(yǔ)句的java api,可以為多種關(guān)系數(shù)據(jù)庫(kù)提供統(tǒng)一訪問(wèn),它由一組用java語(yǔ)言 編寫(xiě)的類(lèi)和接口組成。jdbc提供了一種基準(zhǔn),據(jù)此可以構(gòu)建更高級(jí)的工具和接 口,使數(shù)據(jù)庫(kù)開(kāi)發(fā)人員能夠編寫(xiě)數(shù)據(jù)庫(kù)應(yīng)用程序。有了 jdbc,向各種關(guān)系數(shù)據(jù)發(fā)送sql語(yǔ)句就是一件很容易的事。換言之, 有了 jdbc api,就不必為訪問(wèn)sybase數(shù)據(jù)庫(kù)專(zhuān)門(mén)寫(xiě)一個(gè)程序,為訪問(wèn)oracle 數(shù)據(jù)庫(kù)又專(zhuān)門(mén)寫(xiě)一個(gè)程序,或?yàn)樵L問(wèn)informix數(shù)據(jù)庫(kù)又編寫(xiě)另一個(gè)程序等等,程 序員只需用jdbc api寫(xiě)一個(gè)程序就夠了,它可向相應(yīng)數(shù)據(jù)庫(kù)發(fā)送s
34、ql調(diào)用。 同時(shí),將java語(yǔ)言和jdbc結(jié)合起來(lái)使程序員不必為不同的平臺(tái)編寫(xiě)不同的應(yīng) 用程序,只須寫(xiě)一遍程序就可以讓它在任何平臺(tái)上運(yùn)行,這也是java語(yǔ)言“編 寫(xiě)一次,處處運(yùn)行”的優(yōu)勢(shì)。java數(shù)據(jù)庫(kù)連接體系結(jié)構(gòu)是用于java應(yīng)用程序連接數(shù)據(jù)庫(kù)的標(biāo)準(zhǔn)方法。 jdbc對(duì)java程序員而言是api,對(duì)實(shí)現(xiàn)與數(shù)據(jù)庫(kù)連接的服務(wù)提供商而言是接i i 模型。作為api, jdbc為程序開(kāi)發(fā)提供標(biāo)準(zhǔn)的接口,并為數(shù)據(jù)庫(kù)廠商及第三方 屮間件廠商實(shí)現(xiàn)與數(shù)據(jù)庫(kù)的連接提供了標(biāo)準(zhǔn)方法。jdbc使用已有的sql標(biāo)準(zhǔn)并 支持與其它數(shù)據(jù)庫(kù)連接標(biāo)準(zhǔn),如odbc之間的橋接。jdbc實(shí)現(xiàn)了所有這些面向 標(biāo)準(zhǔn)的目標(biāo)并且具有簡(jiǎn)單、嚴(yán)
35、格類(lèi)型定義且高性能實(shí)現(xiàn)的接口。java具有堅(jiān)固、安全、易于使用、易于理解和可從網(wǎng)絡(luò)上門(mén)動(dòng)卜載等特性, 是編寫(xiě)數(shù)據(jù)庫(kù)應(yīng)用程序的杰出語(yǔ)言。所需要的只是java應(yīng)用程序與各種不同數(shù) 據(jù)庫(kù)之間進(jìn)行對(duì)話(huà)的方法。而jdbc正是作為此種用途的機(jī)制。2.4.2 java數(shù)據(jù)庫(kù)操作由于本系統(tǒng)采用的是mysql數(shù)據(jù)庫(kù),所以本節(jié)接下來(lái)只介紹java語(yǔ)言中 mysql數(shù)據(jù)庫(kù)的使用方法。首先,我們必須在主機(jī)中先安裝好mysql數(shù)據(jù)庫(kù)以及在項(xiàng)目中導(dǎo)入 mysql數(shù)據(jù)庫(kù)的jdbc驅(qū)動(dòng)包以保證java程序能正常訪問(wèn)數(shù)據(jù)庫(kù),以上操作 網(wǎng)上有具體教程,在這里不進(jìn)行詳述。完成上述兩部后,我們就可以使用jdbc提供的api對(duì)mysq
36、l數(shù)據(jù)庫(kù)進(jìn) 行操作,操作過(guò)程主要分成以下幾步:1、加載合適的jdbc驅(qū)動(dòng)程序class-forname(driver);mysql 驅(qū)動(dòng)程序:com.mysql.jdbc.driveroracle 驅(qū)動(dòng)程序:oracle.jdbc.driver.oracledriversqlserver驅(qū)動(dòng)程序:com.microsoft.jdbc.sqlserve 匚 sqlserverdriver2、建立數(shù)據(jù)庫(kù)連接與mysql數(shù)據(jù)庫(kù)連接的方法:connection con=drivermanageigetconnection(“jdbc:mysql:主方l ip 或主 機(jī)名:3306/數(shù)據(jù)庫(kù)名”,用戶(hù)名,
37、密碼);j a v a. sq i. dri vem an ager用來(lái)處理裝載駆動(dòng)程序并口為創(chuàng)建新的數(shù)據(jù)庫(kù) 連接提供支持;java.sql.connection用于完成對(duì)特:定定數(shù)據(jù)庫(kù)的連接;java.sql.statement用于對(duì)特定的數(shù)據(jù)庫(kù)執(zhí)行sql語(yǔ)句; java.sql.statement又包含了以下兩個(gè)重要的子類(lèi)型:java.sql.preparedstatement用于執(zhí)行預(yù)編譯的sql語(yǔ)句;java.sql.callablestatement用于執(zhí)行數(shù)據(jù)庫(kù)屮存儲(chǔ)的過(guò)程的調(diào)用; java.sql.resultset用丁保存查詢(xún)所得的結(jié)杲集3、創(chuàng)建statement對(duì)象state
38、ment st=con.createstatement(); 最后可以不關(guān)閉,但推薦關(guān)閉 利用statement對(duì)象可以執(zhí)行靜態(tài)sql語(yǔ)句,靜態(tài)sql語(yǔ)句可以是select 語(yǔ)句、delete語(yǔ)句、update語(yǔ)句和insert語(yǔ)句。執(zhí)行sql語(yǔ)句statement接口提供了三種執(zhí)彳亍sql語(yǔ)句的方法:executequeryo、 executeupdate()和execute。具體使用哪一個(gè)方法由sql語(yǔ)句木身來(lái)決定。executequery用于產(chǎn)生單個(gè)結(jié)果集的語(yǔ)句,例如select語(yǔ)句等。executeupdate 用于執(zhí)行 insert、update 或 delete 語(yǔ)句以及 sql
39、ddl (數(shù)據(jù)定義語(yǔ)言)語(yǔ)句,例如 create table 和 drop table insert、 update或delete語(yǔ)句的效果是修改表中零行或多行中的一列或多列。 executeupdate的返回值是一個(gè) 整數(shù),指示受影響的行數(shù)(即更新計(jì)數(shù))。對(duì)于 create table或drop table等不操作行的語(yǔ)句,executeupdate的返冋值 總為零。execute用于執(zhí)行返回多個(gè)結(jié)果集、多個(gè)更新計(jì)數(shù)或二者組合的語(yǔ)句。 一般不會(huì)需要該高級(jí)功能。 jdbc在編譯時(shí)并不對(duì)將要執(zhí)行的sql查詢(xún)語(yǔ)句作任何檢查,只是將其 作為一個(gè)string類(lèi)對(duì)象,直到驅(qū)動(dòng)程序執(zhí)行sql查詢(xún)語(yǔ)句時(shí)才知
40、道其是否正確。 對(duì)于錯(cuò)誤的sql杳詢(xún)語(yǔ)句,在執(zhí)行時(shí)將會(huì)產(chǎn)生sqlexceptiono 一個(gè)statement對(duì)象在同一吋間只能打開(kāi)一個(gè)結(jié)果集,對(duì)第二個(gè)結(jié)果集 的打開(kāi)隱含著對(duì)第一個(gè)結(jié)果集的關(guān)閉。 如果想對(duì)多個(gè)結(jié)果集同時(shí)操作,必須創(chuàng)建出多個(gè)statement對(duì)象,在每 個(gè)statement對(duì)象上執(zhí)行sql查詢(xún)語(yǔ)句以獲得相應(yīng)的結(jié)果集。 如果不需要同時(shí)處理多個(gè)結(jié)果集,則可以在一個(gè)statement對(duì)象上順序 執(zhí)行多個(gè)sql查詢(xún)語(yǔ)句,對(duì)獲得的結(jié)果集進(jìn)行順序操作。str="insertinto customer values('wangyang',24,'beijing&
41、#39;,'wangyang')n;int recordnumber=st.executeupdate(str);執(zhí) 行 executeupdate()方法 返冋該 sql語(yǔ)句涉及的記錄數(shù)。str="select* from mycustomer" 查詢(xún)表中記錄resultset rs=st.executequery(str);出于 sql 語(yǔ)句是 select,用 executequeryo 方法,返回一個(gè)結(jié)果集保存在resultset對(duì)象rs屮。4、分析resultset對(duì)象 執(zhí)行完畢sql語(yǔ)句后,將返回一個(gè)resultset類(lèi)的對(duì)彖,它包含所冇的 杳詢(xún)
42、結(jié)果。但對(duì)resultset類(lèi)的對(duì)象方式依賴(lài)于光標(biāo)(cursor)的 類(lèi)型,而對(duì)每 一行中的各個(gè)列,可以按任何順序進(jìn)行處理(當(dāng)然,如果按從左到右的順序?qū)Ω?列進(jìn)行處理可以獲得較高的執(zhí)行效率);resultset類(lèi)中的course方式主要有:resultset.type_forward_only(為缺省設(shè)置):光標(biāo)只能前進(jìn)不能后退, 也就是只能從第一個(gè)一直移動(dòng)到最后一個(gè)。resultset.type_scroll_sensitive:允許光標(biāo)前進(jìn)或后退并感應(yīng)到其它 resultset的光標(biāo)的移動(dòng)情形。resultset.type_scroll_insensitive:允許光標(biāo)前進(jìn)或后退并不能感應(yīng)
43、 到其它resultset的光標(biāo)的移動(dòng)情形。resultset類(lèi)中的數(shù)據(jù)是否允許修改主要冇:resultset.concur_read_only (為缺省設(shè)置):表示數(shù)據(jù)只能只讀,不 能更改。resultset.concur_updatable:表示數(shù)據(jù)允許被修改??趈以在創(chuàng)建statement或preparedstatement對(duì)象時(shí)指定resultset的這兩個(gè)特 性。statement stmt=con.createstatement(resultset.type_forward_only,resultset.concur _read_only);或preparedstatement p
44、stmton.preparestatementc'insert into booktable values (?,?,?)h,resultset.type_scroll_insensitive,resultset.concur_updatab le); resultset類(lèi)的對(duì)象維持一個(gè)指向當(dāng)前行的指針,利用resultset類(lèi)的next() 方法可以移動(dòng)到卜一行(在jdbc中,java程序一次只 能看到一行數(shù)據(jù)),如杲 next()的返回值為false,則說(shuō)明已到記錄集的尾部。另外jdbc也沒(méi)冇類(lèi)似odbc 的書(shū)簽功能的方法。 利用resultset類(lèi)的ge(xxx()方法可以獲得某
45、一列的結(jié)果,其中xxx代 表jdbc中的java數(shù)據(jù)類(lèi)型,如getlnt()> getstring()> getdate()等。訪問(wèn)時(shí)需要 指定要檢索的列(可以采用int值作為列號(hào)(從1開(kāi)始計(jì)數(shù))或指定列(字段) 名方式,但字段名不區(qū)別字母的大小寫(xiě))。示例:while(rs.next()int id=rs.getlnt("id");string name=rs.getstring(ncnamen);int age=rs.getint(ncagen);string address=rs.getstring(ncaddressn);string email=rs.g
46、etstring(hcemailm);system.out.println(id+n n+name+n h+age+n h+address+h h+email);獲得結(jié)果集中的結(jié)構(gòu)信息:利用resultset類(lèi)的getmetadata()方法來(lái)獲得結(jié) 果集屮的一些結(jié)構(gòu)信息(主要提供用來(lái)描述列的數(shù)量、列的名稱(chēng)、列的數(shù)據(jù)類(lèi)型。 利用resulsetmetadata類(lèi)中的方法)。resultsetmetadata rsmd = rs.getmetadata();rsmd.getcolumncounto; 返回結(jié)杲集中的列數(shù) rsmd.getcolumnlabel(l); /返回第一列的列名(字段名)
47、 例如:statement stmt=con.createstatement();resultset rs=stmt.executequery(hselect * from tablename");for(int i=l; i<=rs.getmetadata().getcolumncount(); i+) 跟蹤顯示各個(gè)列的 名稱(chēng)system.out.print(rs. getcolumnname (i)+"t");while(rs.next() 跟蹤顯示各個(gè)列的值for(int j= 1; j<=rs.getmetadata().getcolumnco
48、unt(); j+)system.out.print(rs.getobject(j)+"tn);5、關(guān)閉連接(注意關(guān)閉的順序)例:rs.close();st.close();con.close()2.5 xmpp協(xié)議介紹xmpp (可擴(kuò)展消息處理現(xiàn)場(chǎng)協(xié)議)是基于可擴(kuò)展標(biāo)記語(yǔ)言(xml)的協(xié) 議,它用于即時(shí)消息(im)以及在線(xiàn)現(xiàn)場(chǎng)探測(cè)。它在促進(jìn)服務(wù)器z間的準(zhǔn)即時(shí) 操作。這個(gè)協(xié)議町能最終允許因特網(wǎng)用戶(hù)向因特網(wǎng)上的其他任何人發(fā)送即時(shí)消 息,即使其操作系統(tǒng)和瀏覽器不同。xmpp協(xié)議具有以下特點(diǎn): xmpp協(xié)議是公開(kāi)的,由jsf開(kāi)源社區(qū)組織開(kāi)發(fā)的。xmpp協(xié)議并不屬于 任何的機(jī)構(gòu)和個(gè)人,而是屬
49、于整個(gè)社區(qū),這一點(diǎn)從根本上保證了其開(kāi)放性。 xmpp協(xié)議具有良好的擴(kuò)展性。在xmpp中,即吋消息和到場(chǎng)信息都是基 于xml的結(jié)構(gòu)化信息,這些信息以xml節(jié)(xml stanza)的形式在通信實(shí) 休間交換。xmpp發(fā)揮了 xml結(jié)構(gòu)化數(shù)據(jù)的通用傳輸層的作用,它將出席 和上下文敏感信息嵌入到xml結(jié)構(gòu)化數(shù)據(jù)屮,從而使數(shù)據(jù)以極高的效率傳 送給最合適的資源。基于xml建立起來(lái)的應(yīng)用具有良好的語(yǔ)義完整性和擴(kuò) 展性。 分布式的網(wǎng)絡(luò)架構(gòu)。xmpp協(xié)議都是基于client/server架構(gòu),但是xmpp 協(xié)議本身并沒(méi)有這樣的限制。網(wǎng)絡(luò)的架構(gòu)和電子郵件十分相似,但沒(méi)有結(jié)合 任何特定的網(wǎng)絡(luò)架構(gòu),適用范圍非常廣泛。
50、 xmpp具有很好的彈性。xmpp除了叮用在即時(shí)通信的應(yīng)用程序,還能用 在網(wǎng)絡(luò)管理、內(nèi)容供稿、協(xié)同工具、檔案共享、游戲、遠(yuǎn)端系統(tǒng)監(jiān)控等。 安全性。xmpp在client-to-server通信,和server-to-server通信中都使用 tls (transport layer security)協(xié)議作為通信通道的加密方法,保證通信的安 全。任何xmpp服務(wù)器可以獨(dú)立于公眾xmpp網(wǎng)絡(luò)(例如在企業(yè)內(nèi)部網(wǎng)絡(luò) 中),而使用sasl及tls等技術(shù)更加增強(qiáng)了通信的安全性。xmpp協(xié)議網(wǎng)絡(luò)架構(gòu):xmpp是一個(gè)典型的c/s架構(gòu),而不是像大多數(shù)即時(shí)通訊軟件一樣,使用 p2p客戶(hù)端到客戶(hù)端的架構(gòu),也就是說(shuō)
51、在大多數(shù)情況下,當(dāng)兩個(gè)客戶(hù)端進(jìn)行通訊 時(shí),他們的消息都是通過(guò)服務(wù)器傳遞的(也有例外,例如在兩個(gè)客戶(hù)端傳輸文件 時(shí)).采用這種架構(gòu),主要是為了簡(jiǎn)化客戶(hù)端,將大多數(shù)工作放在服務(wù)器端進(jìn)行, 這樣,客戶(hù)端的工作就比較簡(jiǎn)單,而且,當(dāng)增加功能吋,多數(shù)是在服務(wù)器端進(jìn) 行.xmpp服務(wù)的框架結(jié)構(gòu)如下圖所示.xmpp屮定義了三個(gè)角色,xmpp客戶(hù) 端,xmpp服 務(wù)器、網(wǎng)關(guān).通信能夠在這三者的任意兩個(gè)之間雙向發(fā)生.服務(wù) 器同時(shí)承擔(dān)了客戶(hù)端信息記錄、連接管理和信息的路由功能網(wǎng)關(guān)承擔(dān)著與異構(gòu) 即時(shí)通信系統(tǒng)的互聯(lián) 互通,異構(gòu)系統(tǒng)可以包括sms(短信)、msn、icq等.基 本的網(wǎng)絡(luò)形式是單客戶(hù)端通過(guò)tcp /ip連接
52、到單服務(wù)器,然后在之上傳輸xml, 工作原理是: 節(jié)點(diǎn)連接到服務(wù)器; 服務(wù)器利用本地目錄系統(tǒng)屮的證書(shū)對(duì)其認(rèn)證; 節(jié)點(diǎn)指定目標(biāo)地址,讓服務(wù)器告知目標(biāo)狀態(tài); 服務(wù)器查找、連接并進(jìn)行相互認(rèn)證; 節(jié)點(diǎn)之間進(jìn)行交互。第三章架構(gòu)設(shè)計(jì)木章將會(huì)圍繞著系統(tǒng)的架構(gòu)設(shè)計(jì)展開(kāi)敘述,包括整個(gè)系統(tǒng)的架構(gòu)原理(系統(tǒng) 各主要部件以及部件z間的關(guān)系),業(yè)務(wù)的用例實(shí)現(xiàn)以及系統(tǒng)后臺(tái)數(shù)據(jù)庫(kù)的設(shè)計(jì)。3.1系統(tǒng)架構(gòu)及原理整個(gè)push系統(tǒng)主要分成三大部分,推送端、接收端以及服務(wù)器端,推送端 主要實(shí)現(xiàn)消息的發(fā)布,發(fā)布的消息將會(huì)發(fā)送到服務(wù)器屮進(jìn)行儲(chǔ)存處理;服務(wù)器接 收到發(fā)布消息后會(huì)口動(dòng)查找出該發(fā)布方的所有訂閱接收方,并檢測(cè)接收方是否在 線(xiàn)監(jiān)聽(tīng)
53、消息,如果是則向其轉(zhuǎn)發(fā)推送消息,如果沒(méi)冇在線(xiàn)就會(huì)將消息保存起來(lái), 等接收方卜次登陸的時(shí)候再?gòu)南到y(tǒng)中取出來(lái)轉(zhuǎn)發(fā)出去;接收方登陸過(guò)后就可以監(jiān) 聽(tīng)消息,而需要監(jiān)聽(tīng)什么消息也是完全有自己確定,通過(guò)訂閱命令可以訂閱自己 喜歡的頻道。整個(gè)推送系統(tǒng)的設(shè)計(jì)重點(diǎn)落在了服務(wù)器端,因?yàn)榉?wù)器連接著網(wǎng)方,起著傳 遞數(shù)據(jù)的媒介作用,而月其屮述要做很多的處理。服務(wù)器由一下幾大部件構(gòu)成: manager -負(fù)責(zé)處理和管理來(lái)自?xún)啥说恼?qǐng)求,是整個(gè)系統(tǒng)的最高層的核 心部件; parser -解析部件,負(fù)責(zé)解析來(lái)自客戶(hù)端的請(qǐng)求; cache緩存部件,負(fù)責(zé)管理存放服務(wù)系統(tǒng)屮的一些頻繁常用的數(shù)據(jù), 數(shù)據(jù)都保存在內(nèi)存中,以降低后臺(tái)數(shù)據(jù)庫(kù)
54、的壓力; dbmanager 數(shù)據(jù)庫(kù)管理部件,負(fù)責(zé)管理后臺(tái)數(shù)據(jù)庫(kù)以及對(duì)數(shù)據(jù)庫(kù)進(jìn) 行操作; loger-日志部件,負(fù)責(zé)將系統(tǒng)行為輸出到日志文件中,以供查詢(xún); onlinemanager 負(fù)責(zé)管理與客戶(hù)端的連接,連接分為長(zhǎng)連接和短連接 兩種,分別存放在兩個(gè)不同的數(shù)據(jù)結(jié)構(gòu)中去;上述部件在系統(tǒng)屮都有著自己的工作職責(zé),通過(guò)它們之間的合作依賴(lài)推送服 務(wù)器就能順利的獲取來(lái)口發(fā)送端的消息并口將之安全送到接收端去,完成了推送系統(tǒng)的核心功能。3.2業(yè)務(wù)用例的實(shí)現(xiàn)本節(jié)會(huì)簡(jiǎn)述push系統(tǒng)的一些具體業(yè)務(wù)用例,主要圍繞著兩個(gè)方面展開(kāi),一 個(gè)是發(fā)送方,另一個(gè)是接受方,雙方的需求不同因此功能用例也各不相同。推送方可以進(jìn)行登錄
55、、注冊(cè)、注銷(xiāo)以及推送消息等業(yè)務(wù)行為:pusher圖3.2.1推送方用例圖接收方業(yè)務(wù)功能相對(duì)多一點(diǎn),用戶(hù)模塊方面他可以登錄、注冊(cè)、注銷(xiāo)等,登 錄完成后可以進(jìn)行監(jiān)聽(tīng)消息以及取消監(jiān)聽(tīng),還有訂閱/取消訂閱已經(jīng)查找訂閱號(hào) 功能:圖3.2.2接收方用例圖以下是一個(gè)完整推送流程的順序圖:推送條統(tǒng)圖3.2.3推送流程圖3.3數(shù)據(jù)庫(kù)設(shè)計(jì)由于推送系統(tǒng)會(huì)面臨高并發(fā)的運(yùn)行壓力,用戶(hù)量的增大會(huì)使得服務(wù)器對(duì)數(shù) 據(jù)庫(kù)的頻繁訪問(wèn)查詢(xún),因此對(duì)數(shù)據(jù)庫(kù)的設(shè)計(jì)冇著很高性能要求,如何優(yōu)化數(shù)據(jù)庫(kù) 的表關(guān)系,如何優(yōu)化數(shù)據(jù)的存儲(chǔ)方式將會(huì)大大決定了系統(tǒng)的運(yùn)行效杲。木系統(tǒng)使 用mysql關(guān)系型數(shù)據(jù)庫(kù)來(lái)維護(hù)系統(tǒng)的數(shù)據(jù),使用的儲(chǔ)存引擎的innodb
56、o3.3.1構(gòu)建數(shù)據(jù)庫(kù)的系統(tǒng)流程構(gòu)建一個(gè)完整、高效的數(shù)據(jù)庫(kù)管理系統(tǒng)可以說(shuō)是一個(gè)比較復(fù)朵的過(guò)程,通常包含以下5個(gè)基本步驟。1、定義數(shù)據(jù)庫(kù)的目標(biāo)在這一步,需要定義數(shù)據(jù)庫(kù)實(shí)現(xiàn)功能,目標(biāo)以及系統(tǒng)運(yùn)行的環(huán)境,最終形成一個(gè)怎么樣的數(shù)據(jù)庫(kù)管理系統(tǒng)。2、數(shù)據(jù)庫(kù)的邏輯設(shè)計(jì)規(guī)劃出數(shù)據(jù)庫(kù)的邏輯設(shè)計(jì),例如:設(shè)計(jì)數(shù)據(jù)庫(kù)屮如何定義表以及表z間的關(guān)系。在某種程度上說(shuō),這一步和物理數(shù)據(jù)庫(kù)的設(shè)計(jì)以及實(shí)現(xiàn)無(wú)關(guān)。3、數(shù)據(jù)庫(kù)的物理設(shè)計(jì)這一步在數(shù)據(jù)庫(kù)的邏輯設(shè)計(jì)之上,把數(shù)據(jù)庫(kù)的邏輯設(shè)計(jì)轉(zhuǎn)化為數(shù)據(jù)庫(kù)的物理設(shè)計(jì),如確定數(shù)據(jù)庫(kù)需要哪些軟件和碩件。4、數(shù)據(jù)庫(kù)的物理實(shí)現(xiàn)這一步屬于項(xiàng)目的實(shí)現(xiàn)階段。它建立在數(shù)據(jù)庫(kù)的物理設(shè)計(jì)z上,設(shè)計(jì)實(shí)際的物理數(shù)據(jù)以及
57、數(shù)據(jù)庫(kù)的服務(wù)器配置和存儲(chǔ)數(shù)據(jù)的程序代碼等。5、復(fù)查構(gòu)建的數(shù)據(jù)庫(kù)這一步為構(gòu)建數(shù)據(jù)庫(kù)的最后一步,檢查和評(píng)定構(gòu)建的數(shù)據(jù)庫(kù)是否滿(mǎn)足笫一步中的目標(biāo)及莫要求,同時(shí)述可以制定維護(hù)和更新數(shù)據(jù)庫(kù)的實(shí)施方案。構(gòu)建數(shù)據(jù)庫(kù)系統(tǒng)的流程如卜圖所示:圖數(shù)據(jù)庫(kù)設(shè)計(jì)步驟3.3.2表的具體設(shè)計(jì) 每個(gè)pusher方都有屬于口己的基木信息,包括簡(jiǎn)介、昵稱(chēng)、id、密碼、 發(fā)送口令等等,為了方便修改信息以及管理,我們將之統(tǒng)一存放到一個(gè)pushers 表屮。另外,由于系統(tǒng)在實(shí)際運(yùn)行過(guò)程屮會(huì)頻繁的根據(jù)pusherld對(duì)pushers表進(jìn) 行查詢(xún),因此需要將id字段定義為主鍵,這樣一來(lái)不僅可以保證了 pushehd的 唯一性,i佃且innodb引擎會(huì)自動(dòng)生成一個(gè)id字段的索引以加大搜索效率。由 丁用戶(hù)昵稱(chēng)以及密碼不能為空,所以我們還要對(duì)這些字段用not null關(guān)鍵字修飾。圖數(shù)據(jù)庫(kù)pushers表設(shè)計(jì)圖 每個(gè)接收方都有自己的基本信息,包括id、用戶(hù)名和登陸密碼等,統(tǒng) 一存放在recievers表屮,所有的字段都設(shè)置為非空,因?yàn)檫@些都是用戶(hù)的必要 信息,缺一不可,另外
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年韓語(yǔ)TOPIK高級(jí)6級(jí)寫(xiě)作突破:議論文寫(xiě)作技巧精講試卷
- 六西格瑪綠帶流程改善案例
- 2025年鄉(xiāng)村醫(yī)生農(nóng)村婦幼保健知識(shí)鄉(xiāng)村醫(yī)療人才培養(yǎng)策略試題
- 2025年注冊(cè)會(huì)計(jì)師CPA經(jīng)濟(jì)法模擬試卷(公司法與合同法)實(shí)戰(zhàn)演練試題
- 病例康復(fù)治療匯報(bào)
- 高中化學(xué)魯科版 (2019)選擇性必修2第3節(jié) 元素性質(zhì)及其變化規(guī)律綜合訓(xùn)練題
- 2025年考研數(shù)學(xué)(三)模擬沖刺卷:解析技巧實(shí)戰(zhàn)演練沖刺高分
- 2025年人力資源管理師專(zhuān)業(yè)技能考核試卷:人力資源戰(zhàn)略規(guī)劃與實(shí)施
- 公司?;钒踩芾眢w系構(gòu)建
- 2025年社區(qū)服務(wù)管理師職業(yè)技能認(rèn)證模擬試卷(社區(qū)服務(wù)規(guī)劃與實(shí)施)-社區(qū)服務(wù)項(xiàng)目管理策略
- 烘培創(chuàng)業(yè)合伙協(xié)議書(shū)
- 北京2025年國(guó)家大劇院招聘24名專(zhuān)業(yè)技術(shù)人員筆試歷年參考題庫(kù)附帶答案詳解
- 2024建安杯信息通信建設(shè)行業(yè)安全競(jìng)賽題庫(kù)及答案【三份】
- 2025年信息系統(tǒng)管理知識(shí)考試試題及答案
- 中介股東合同范例
- 馬法理學(xué)試題及答案
- 2025年全國(guó)保密教育線(xiàn)上培訓(xùn)考試試題庫(kù)附完整答案(奪冠系列)含答案詳解
- 合伙人協(xié)議書(shū)模板
- 2025年下半年揚(yáng)州現(xiàn)代農(nóng)業(yè)生態(tài)環(huán)境投資發(fā)展集團(tuán)公開(kāi)招聘易考易錯(cuò)模擬試題(共500題)試卷后附參考答案
- 2025年中考第一次模擬考試卷:生物(成都卷)解析版
- 量子計(jì)算中的量子比特穩(wěn)定性研究-全面剖析
評(píng)論
0/150
提交評(píng)論