即時(shí)通訊系統(tǒng)設(shè)計(jì)_第1頁
即時(shí)通訊系統(tǒng)設(shè)計(jì)_第2頁
即時(shí)通訊系統(tǒng)設(shè)計(jì)_第3頁
即時(shí)通訊系統(tǒng)設(shè)計(jì)_第4頁
即時(shí)通訊系統(tǒng)設(shè)計(jì)_第5頁
已閱讀5頁,還剩39頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

摘要目前,關(guān)于即時(shí)通訊系統(tǒng)(InstantMessagingSystem)的研究是互聯(lián)網(wǎng)中一個(gè)熱門方向,尤其是關(guān)于企業(yè)級(jí)的即時(shí)通訊系統(tǒng)更是成為了國內(nèi)外應(yīng)用的熱點(diǎn)。企業(yè)版的即時(shí)通訊軟件的誕生,給企業(yè)的管理帶來了新的思路和方法,提高了企業(yè)的工作效率,降低了辦公費(fèi)用,引發(fā)了工程應(yīng)用領(lǐng)域的新研究熱潮。即時(shí)通訊系統(tǒng)基本上均采用客戶機(jī)/服務(wù)器(C/S)模式。在此模式下,服務(wù)器無疑是處于核心地位的。本文正是圍繞即時(shí)通訊系統(tǒng)服務(wù)器端軟件開發(fā)這一核心展開。首先,本文選擇了當(dāng)今流行的各種即時(shí)通訊軟件,進(jìn)行對(duì)比分析,確定了即時(shí)通訊系統(tǒng)的功能,提出了不同的即時(shí)通訊服務(wù)器的架構(gòu)。其次,本文介紹了本系統(tǒng)使用的目前流行的一些技術(shù),如多線程技術(shù)TCP/IP協(xié)議和OSI模型、套接字(socket)通信結(jié)構(gòu)等圍繞即時(shí)通訊的基本文字交流功能,設(shè)計(jì)了不同用戶之間的文字通訊。本系統(tǒng)就是在此企業(yè)即時(shí)通信市場(chǎng)日益高漲的時(shí)候,采用先進(jìn)的JavaSocket技術(shù),開發(fā)出一個(gè)C/S模式的基于TCP/UDP協(xié)議的網(wǎng)絡(luò)通信系統(tǒng)。該系統(tǒng)充分利用了Java的跨平臺(tái)性,結(jié)合目前已有的典型通訊軟件BBS和OICQ的某些技術(shù),采用TCP/UDP協(xié)議與服務(wù)器轉(zhuǎn)發(fā)的技術(shù),擴(kuò)展了文件發(fā)送的功能,使得客戶間發(fā)送文件不受防火墻限制。同時(shí)在時(shí)間允許的情況下增加語音、視頻以及網(wǎng)絡(luò)電視等功能。關(guān)鍵詞:即時(shí)通訊系統(tǒng)OICQC/S模式ITheInternetMessagingSystemBasedonJavaAbstractNowtheresearchaboutinstantmessagingsystemisahotdirectionininternet,especiallytheinstantmessagingsystemforenterprisegroupisahotspotinpracticingintheworld.Theinstantmessagingsystemforenterprisegroupbringsnewthoughtsandwaysforenterprisemanagement,raisestheworkingefficiency,cutsdowntheadministrativeexpenses,andinitiatesthenewtrendinindustrialpracticingfield.InstantmessagingsystemmainlyselectsC/Smode.Serveristhecorepartinthismode.Thispaperjustbasesonthedevelopmentofinstantmessagingsystemsoftware.First,thispaperselectsseveralkindsofpopularinstantmessagingsoftware,contrastsandanalyzeseachone,definesthefunctionsofinstantmessagingsystem,advancesthedifferentstructuresofinstantmessagingservers.Second,thispaperintroducessometechniqueswhichareusedinthissystem,eg:TCP/IP,OSIandsocketetc.basiccommunicatingfunctionsofinstantmessagingsystem,designsthecharactersandwritingcommunicationbetweendifferentusers.ThissystemselectsadvancedJavaSockettechnique,developsaC/SmodeinternetcommunicationsystemwhichisbasedonTCP/UDP.ThissystemusestheJava’smulti-platformfeaturefully,combinessometechniquesofthetypicalinstantmessagingsoftwarelikeOICQwhichexistnow,selectsTCP/UDPagreementandservertransmittingtechniques,expandsthefilestransmittingfunction,whichenablesnorestrictionfromfirewallwhilesendingfilesbetweenusers.Meanwhile,itaddsfunctionslikeinternetcall,videocallandinternetTVetc.whenthetimeissufficient.Keywords:InstantMessagingSystemOICQC/SModeII目錄摘要……………IAbstract……………………II1引言…………52研究綜述……………………62.1Internet通信概述……………72.2目前流行的即時(shí)通信軟件簡(jiǎn)介………………72.2.1ICQ…………72.2.2騰訊OICQ……………………82.2.3MSN…………82.2.4雅虎通Yahoo!Messenger…………………82.2.5朗瑪U(kuò)C………82.3即時(shí)通信軟件在企業(yè)中的運(yùn)用情況簡(jiǎn)介……83相關(guān)技術(shù)簡(jiǎn)介………………103.1主流的網(wǎng)絡(luò)通信模型……103.1.1C/S模型……………………103.1.2B/S模型……………………113.1.3P2P模型……………………123.2TCP/IP協(xié)議和OSI模型………133.2.1OSI模型……………………133.2.2TCP/IP協(xié)議………………143.2.3套接字………153.3程序采用的主要技術(shù)…………163.3.1多線程技術(shù)…………………163.3.2客戶/服務(wù)器程序設(shè)計(jì)范式………………173.4MySQL簡(jiǎn)介……………………184系統(tǒng)設(shè)計(jì)……………………194.1總體設(shè)計(jì)………194.2系統(tǒng)功能設(shè)計(jì)…………………194.3數(shù)據(jù)庫設(shè)計(jì)……………………205詳細(xì)設(shè)計(jì)與實(shí)現(xiàn)……………215.1服務(wù)器程序……………………215.2客戶端…………296系統(tǒng)測(cè)試……………………426.1軟件測(cè)試………426.2軟件測(cè)試目的…………………427總結(jié)…………43參考文獻(xiàn)……………………44謝辭…………451引言近年來,即時(shí)通信發(fā)展迅速,呈現(xiàn)出繼語音、視頻、短信之后的通信網(wǎng)絡(luò)基本業(yè)務(wù)能力,成為越來越多的人在交友、工作、交易和咨詢中的首選方式。當(dāng)前,即時(shí)通信正從單純的呈現(xiàn)和即時(shí)消息向多媒體綜合通信方向發(fā)展,逐步占領(lǐng)企業(yè)和個(gè)人綜合通信市場(chǎng)。無縫溝通是即時(shí)通信發(fā)展的方向。近期中國移動(dòng)推出的“飛信”業(yè)務(wù),就是突出在線即時(shí)消息與下線短信的轉(zhuǎn)換,保持信息的無縫溝通。不僅如此,覆蓋移動(dòng)與固定終端的音/視頻會(huì)議群組通信等都是即時(shí)通信所關(guān)注的重要內(nèi)容。多媒體的融合應(yīng)用已成為即時(shí)通信發(fā)展的方向。據(jù)國外互聯(lián)網(wǎng)市場(chǎng)研究公司RadicatiGroup的統(tǒng)計(jì)數(shù)據(jù)顯示:2006年全球即時(shí)通信用戶數(shù)量已經(jīng)達(dá)到4.32億,到2010年預(yù)計(jì)全球?qū)⒂?.5億即時(shí)通信用戶。據(jù)CNNIC統(tǒng)計(jì),2006年中國即時(shí)通信用戶數(shù)量達(dá)到1.16億,即時(shí)通信軟件在互聯(lián)網(wǎng)用戶中的滲透率達(dá)到86%。隨著網(wǎng)絡(luò)接入的寬帶化和終端智能化程度的提高,即時(shí)通信正向集呈現(xiàn)、即時(shí)消息、語音、視頻、會(huì)議、應(yīng)用共享為一體的融合通信方向發(fā)展?!盁o縫溝通、多媒體交流”已成為即時(shí)通信的特征。即時(shí)通信從個(gè)人向企業(yè)通信滲透,對(duì)于企業(yè)來說,即時(shí)通信相對(duì)于傳統(tǒng)的電話、手機(jī)、傳真和郵件等溝通方式,無疑在溝通和協(xié)作等方面具備快捷和實(shí)時(shí)等優(yōu)勢(shì)。企業(yè)通信與企業(yè)的運(yùn)作流程密切相關(guān),即時(shí)通信的引入,大大提高了企業(yè)的綜合通信能力。例如:由企業(yè)管理員維護(hù)的企業(yè)通信錄,可即時(shí)看到員工的呈現(xiàn)狀態(tài);群發(fā)的即時(shí)消息,是企業(yè)發(fā)布公告或會(huì)議通知的理想方式;即時(shí)發(fā)起的音/視頻會(huì)議以及應(yīng)用協(xié)同,為在異地辦公的人員實(shí)時(shí)溝通提供了便捷的手段等等。本系統(tǒng)就是針對(duì)當(dāng)前市場(chǎng)的需求和技術(shù)的不斷發(fā)展、企業(yè)對(duì)即時(shí)通信的需求日益增加,同時(shí)由于個(gè)人即時(shí)通信軟件存在著安全性和可管理性差等明顯的問題和不足,所以具有“無縫溝通、多媒體交流”特征的企業(yè)即時(shí)通訊系統(tǒng)應(yīng)運(yùn)而生。2研究綜述2.1Internet通信概述Internet通信目前已經(jīng)成為人們生活的一個(gè)基本部分。“溝通無極限”,移動(dòng)通訊的廣告語其實(shí)更適合即時(shí)聊天。即時(shí)聊天使親友的溝通突破時(shí)空使辦公室的溝通突破上下級(jí)極限,使陌生人的溝通突破環(huán)境極限,使自我與的溝通突破心理極限。如果說互聯(lián)網(wǎng)創(chuàng)造了新生活,那么讓新生活變得更暢快的就是即時(shí)通訊(InstantMessagingSoftware,以下簡(jiǎn)稱IM)。早期在互聯(lián)網(wǎng)上,人們只能E-Mail、新聞組、BBS等“原始”方式交流,往往不能夠及時(shí)把消息傳遞給甚至不知道對(duì)方什么時(shí)候能夠看到,或有誰能看到誰又會(huì)回應(yīng)。作為使用頻率最高的網(wǎng)絡(luò)軟件即時(shí)聊天已經(jīng)突破了作為技術(shù)工具的極認(rèn)為是現(xiàn)代交流方式的象征,并構(gòu)建起一種新的社會(huì)關(guān)系。它是迄今為止對(duì)社會(huì)生活改變最為深刻的一種網(wǎng)絡(luò)新形態(tài),沒有極限的溝通將帶來沒有極限活。據(jù)統(tǒng)計(jì),迄今為止,全球約有一億多人使用即時(shí)通訊軟件在網(wǎng)上交流網(wǎng)民慣用的即時(shí)通訊軟件——“騰訊QQ”從1999年2月誕生到現(xiàn)在,注戶已超過1.6億,2004年12月4日最高同時(shí)在線人數(shù)突破900萬人,而每立上線人數(shù)更是達(dá)到一千二百多萬,擁有活躍用戶5500萬,幾乎覆蓋所有網(wǎng)民。行業(yè)研究機(jī)構(gòu)RadicatiGroup公司一項(xiàng)題為《2003--2007間的即時(shí)通存在市場(chǎng)趨勢(shì)》的預(yù)測(cè)報(bào)告稱,全球的即時(shí)通信服務(wù)賬戶將由去年的5.9億增長到2007年的14.39億美元,而即時(shí)通訊軟件市場(chǎng)將由2003年底時(shí)的美元大幅成長至2007年的2570萬美元。其中企業(yè)領(lǐng)域增長顯著,賬戶數(shù)量去年的6000萬增長到2007年的3.49億,增長幅度高達(dá)600%。即時(shí)通訊軟件的互動(dòng)性高于BBS和E-mail,它比電話嚴(yán)肅,比E-mail利用它可以實(shí)時(shí)傳送文字信息、語音信息和發(fā)送文件。另外,它還可以作為內(nèi)部聯(lián)絡(luò)的一種方式,可以用來召開網(wǎng)絡(luò)會(huì)議,比起實(shí)地的會(huì)議來,不僅而且節(jié)省開支。就像現(xiàn)代社會(huì)的電話一樣,目前即時(shí)通訊軟件的確做到了這一點(diǎn)。2.2目前流行的即時(shí)通訊軟件簡(jiǎn)介目前市面上流行的即時(shí)通訊軟件主要有:ICQ、“騰迅QQ”、MSN、YAHOOMESSENGER以及UC等等。2.2.1ICQ原是以色列的幾名學(xué)生開發(fā)出來的一款即時(shí)通訊工具軟件。它利用點(diǎn)的方式通訊,任何登錄ICQ服務(wù)器的用戶,盡管國籍、膚色、文化背景教信仰不同,都能夠在網(wǎng)上即時(shí)溝通。任何人只要擁有ICQ號(hào)碼,就可以界各地的人做朋友,它的互動(dòng)性是Web網(wǎng)頁、虛擬社區(qū)和電子郵件所無法的。在辦公室中,同事之間透過ICQ聯(lián)絡(luò)事宜,就算近在咫尺,也無須起談;與遠(yuǎn)方的親朋好友交談,也只是輕輕敲幾下鍵盤就可以解決問題,這種在過去幾乎是無法想象的。但I(xiàn)CQ對(duì)中文的支持比較差,不適于中國企業(yè)用。2.2.2騰訊OICQ,簡(jiǎn)稱QQ,是國內(nèi)最時(shí)髦的即時(shí)通訊工具,其用戶的年齡層次從剛開中小學(xué)生族,發(fā)展到現(xiàn)在的幾乎所有上網(wǎng)者。每當(dāng)看到連到網(wǎng)上的一臺(tái)臺(tái)電屏幕上跳躍著一個(gè)個(gè)各式各樣“小人頭兒”,就知道QQ上的好友來信了。目迅QQ”開展了大量的網(wǎng)絡(luò)增值服務(wù),如為其用戶提供網(wǎng)上尋呼、視頻聊天音聊天、網(wǎng)絡(luò)硬盤、動(dòng)態(tài)新聞等信息,開通手機(jī)上的移動(dòng)QQ服務(wù),并且于年5月中旬推出了QQ2004版軟件,同時(shí)為每一個(gè)QQ賬號(hào)送一個(gè)5M的免箱。2.2.3MSN軟件巨頭微軟開發(fā)了MSNMessenger,把MSNMessenger嵌WindowsXP操作系統(tǒng)里。MSNMessenger有近30種語言的不同版本。您還使用此免費(fèi)程序撥打電話,用交談取代輸入,向手機(jī)發(fā)送消息,監(jiān)視新的電件,共享圖片或其他任何文件,邀請(qǐng)朋友玩DirectPlay兼容游戲等等。目前Messenger已經(jīng)推出ver6.2,在功能和外觀上都有很大的變化,在外觀界面也比以前的版本更加生動(dòng)。2.2.4雅虎通Yahoo!Messenger(雅虎通)是由美國著名綜合門戶類網(wǎng)站Yahoo!推出的聊天軟件。Yahoo!Messenger的功能側(cè)重點(diǎn)似乎并不在它的聊天功能上,它更像一個(gè)免息提供器。Yahoo!Messenger支持多種操作系統(tǒng),并支持其它便攜式無線具有與其它即時(shí)通訊軟件所不同的商業(yè)價(jià)值。你不僅可以隨時(shí)查看新聞和天報(bào),甚至可以隨時(shí)查閱股票行情。你還能利用Yahoo!Messenger安排自己的行程計(jì)劃,隨時(shí)收發(fā)新郵件。2.2.5朗瑪U(kuò)C朗瑪U(kuò)C是2002年里新涌現(xiàn)的即時(shí)通訊軟件代表,它的開發(fā)者想通過電子科技大學(xué)碩士學(xué)位論文:企業(yè)即時(shí)通訊系統(tǒng)服務(wù)器的設(shè)計(jì)。UC給大家?guī)磉@樣一個(gè)全新的聊天理念:新一代開放式即時(shí)通訊娛樂平臺(tái)瑪U(kuò)C也的確給了我們一種前所未有的聊天新感覺:網(wǎng)上聊天,也可以情景它采用自由變換場(chǎng)景、個(gè)性在線心情等人性化設(shè)計(jì),配合視頻電話、信息文件互傳、在線游戲等使您在聊天的同時(shí)能邊說、邊看、邊玩。2.3即時(shí)通訊軟件在企業(yè)中的運(yùn)用情況簡(jiǎn)介目前流行的即時(shí)通訊軟件都有其各自的特點(diǎn),但它們多是針對(duì)的是個(gè)人用戶,而不是大企業(yè)用戶。目前,即時(shí)通訊件從開始的單一的信息實(shí)時(shí)交流,發(fā)展到如今的集即時(shí)在線娛樂、視頻會(huì)議以及手機(jī)短信等諸多功能于一體。如此迅猛的發(fā)展多企業(yè)用戶考慮使用即時(shí)通訊來提高內(nèi)部交流的質(zhì)量,理順內(nèi)部交流渠道內(nèi)部交流成本。尤其對(duì)跨國的大公司大集團(tuán)更是有迫切的需要。事實(shí)上,企時(shí)通信工具在國外一些企業(yè)已經(jīng)被廣泛應(yīng)用,比如IBM通過使用即時(shí)通信所節(jié)省下來的國際電話費(fèi)及差旅費(fèi),每年就可節(jié)省四億美元。然而即時(shí)通訊軟件也給企業(yè)用戶帶來了一定的尷尬和困難。目前,尤其是大型企業(yè),大都有自己的Intranet網(wǎng)絡(luò),其大多的工作流或內(nèi)流都可以通過內(nèi)部的Intranet完成。如果企業(yè)中員工都使用目前免費(fèi)的幾種通訊軟件,則必須對(duì)這些使用進(jìn)行嚴(yán)格的審計(jì)和管理,這無疑給IT部門的帶來了一定的麻煩。加之,由于網(wǎng)絡(luò)的虛擬性,即時(shí)通訊軟件均允許自己任意命名,這更給用戶的管理帶來了不便。綜合分析以上原因,本文認(rèn)為,有必要自主開發(fā)應(yīng)用于企業(yè)的即時(shí)通訊系統(tǒng)軟件。從調(diào)研結(jié)果來看,盡管目前有多種即時(shí)通訊產(chǎn)品的問世,有的產(chǎn)品有良好的客戶群體,但商業(yè)機(jī)構(gòu)的實(shí)踐活動(dòng)由于其實(shí)用化的取向,所以在即時(shí)通訊研究工作方面并不活躍。同時(shí),出于商業(yè)機(jī)密的考慮,根本就沒有公開論著學(xué)術(shù)化的即時(shí)通訊研究,國外公開發(fā)表的論文也非常少。通訊基本服務(wù)元素的定義方面。還有部分關(guān)于安全性的討論從“中國期刊網(wǎng)”和“萬方數(shù)字化期刊”等國內(nèi)論文調(diào)研的情況看來,部分文章是商業(yè)即時(shí)通訊工具的使用介紹。雖然有少數(shù)幾篇討論“網(wǎng)絡(luò)傳呼編程技巧的論文,但普遍存在一些誤解,如把即時(shí)通訊系統(tǒng)等同于聊天甚至還把即時(shí)通訊系統(tǒng)混淆成網(wǎng)絡(luò)聊天室,而后者事實(shí)上是采用網(wǎng)絡(luò)中轉(zhuǎn)聊議[9](InternetRelayChatProtocol,IRCP)的網(wǎng)站服務(wù)。總的說來,國內(nèi)外關(guān)于即時(shí)通訊的研究還不夠系統(tǒng)和深入。本系統(tǒng)就是在此時(shí)企業(yè)即時(shí)通信市場(chǎng)日益高漲的時(shí)候,采用先進(jìn)的JavaSocket技術(shù),開發(fā)出一個(gè)C/S模式的基于TCP/UDP協(xié)議的網(wǎng)絡(luò)通信系統(tǒng).該系統(tǒng)充分利用了Java的跨平臺(tái)性,結(jié)合目前已有的典型通訊軟件BBS和OICQ的某些技術(shù),采用TCP/UDP協(xié)議與服務(wù)器轉(zhuǎn)發(fā)的技術(shù),擴(kuò)展了文件發(fā)送的功能,使得客戶間發(fā)送文件不受防火墻限制.同時(shí)在時(shí)間允許的情況下增加語音、視頻以及網(wǎng)絡(luò)電視等功能。3相關(guān)技術(shù)簡(jiǎn)介該即時(shí)通信系統(tǒng)是在客戶端/服務(wù)器程序設(shè)計(jì)范式基礎(chǔ)上按照軟件工程設(shè)計(jì)思想,采用大量的計(jì)算機(jī)程序設(shè)計(jì)技術(shù)和網(wǎng)絡(luò)通信技術(shù)設(shè)計(jì)并實(shí)現(xiàn)的。本章將介紹主流的網(wǎng)絡(luò)通信模型、網(wǎng)絡(luò)通信技術(shù)、密碼學(xué)相關(guān)知識(shí)和程序設(shè)計(jì)主要采用的Windows編程技術(shù)。3.1主流的網(wǎng)絡(luò)通信模型3.1.1C/S(Client/Server,客戶/服務(wù)器)模型,該模型可以合理利用兩端硬件環(huán)境優(yōu)勢(shì),將任務(wù)合理分配到客戶端和服務(wù)器,降低系統(tǒng)通信開銷[7]。在這種結(jié)構(gòu)中,服務(wù)器處于系統(tǒng)的中心地位。服務(wù)器是一個(gè)擁有強(qiáng)大處理能力和很大帶寬的高性能計(jì)算機(jī),數(shù)據(jù)和信息都保存在服務(wù)器上。服務(wù)器始終處于工作狀態(tài),它被動(dòng)地接受客戶連接,根據(jù)客戶的請(qǐng)求提供相應(yīng)的服務(wù)。體系結(jié)構(gòu)如圖2.1所示。C/S結(jié)構(gòu)可分為傳統(tǒng)的兩層結(jié)構(gòu)和新型的三層結(jié)構(gòu)。二層結(jié)構(gòu)出現(xiàn)在20世紀(jì)80年代后期。在這種結(jié)構(gòu)中,服務(wù)器只負(fù)責(zé)各種數(shù)據(jù)的處理和維護(hù),為各個(gè)客戶機(jī)應(yīng)用程序管理數(shù)據(jù);客戶機(jī)中有文檔處理軟件、決策支持工具、數(shù)據(jù)查詢等應(yīng)用邏輯程序,采用SQL語句發(fā)送請(qǐng)求和分析從服務(wù)器接收的數(shù)據(jù)。這是一種“胖客戶機(jī)(FatClient)”、“瘦服務(wù)器(ThinServer)”的網(wǎng)絡(luò)結(jié)構(gòu)模式。其軟件模型如圖2.2所示。隨著其應(yīng)用范圍的不斷擴(kuò)大,兩層結(jié)構(gòu)帶來的系統(tǒng)可靠性低、缺乏靈活性、資源浪費(fèi)嚴(yán)重以及維護(hù)費(fèi)用較高等問題日益明顯,網(wǎng)絡(luò)計(jì)算模式逐漸從兩層模式擴(kuò)展到三層模式。在三層結(jié)構(gòu)中,應(yīng)用邏輯程序從客戶機(jī)上分離出來,進(jìn)而發(fā)展為應(yīng)用服務(wù)器或Web服務(wù)器。這是一種“瘦客戶機(jī)”網(wǎng)絡(luò)結(jié)構(gòu)模式,客戶端只有界面顯示程序,只需在服務(wù)器端隨機(jī)增加應(yīng)用服務(wù)即可滿足系統(tǒng)的需要,可以用較少的資源建立起具有很強(qiáng)伸縮性的系統(tǒng),這也是當(dāng)前Internet上最先進(jìn)的技術(shù)之一。其軟件模型如圖2.3所示。3.1.2B/S模型B/S(Browser/Server,瀏覽器/服務(wù)器)模型,是隨著Internet技術(shù)的興起,對(duì)C/S結(jié)構(gòu)的一種變化和改進(jìn)的結(jié)構(gòu)。該結(jié)構(gòu)使用瀏覽器通過HTTP協(xié)議訪問Web服務(wù)器。B/S三層結(jié)構(gòu)如圖2.4所示。在B/S三層結(jié)構(gòu)中,數(shù)據(jù)庫服務(wù)器(DBServer)使用關(guān)系數(shù)據(jù)庫存儲(chǔ)系統(tǒng)中所有的數(shù)據(jù),WebServer處理客戶端的請(qǐng)求。客戶端使用瀏覽器訪問WebServer,功能更加簡(jiǎn)單,它只顯示數(shù)據(jù)和提供用戶輸入界面的功能,絕大多數(shù)的計(jì)算都在WebServer上。這種“瘦客戶”的思想非常適于系統(tǒng)部署。3.1.3P2P模型P2P(PeertoPeer,對(duì)等連接或?qū)Φ染W(wǎng)絡(luò))模型,是指網(wǎng)絡(luò)中的物理節(jié)點(diǎn)在邏輯上以相同的地位進(jìn)行通信的模型,而不是處理能力的對(duì)等[8]。相對(duì)于傳統(tǒng)的集中式C/S模型,其弱化了服務(wù)器的概念,系統(tǒng)中的各個(gè)節(jié)點(diǎn)不再區(qū)分服務(wù)器和客戶端的角色關(guān)系,每個(gè)節(jié)點(diǎn)既可請(qǐng)求服務(wù),也可提供服務(wù),節(jié)點(diǎn)之間可以直接交換資源和服務(wù)而不必通過服務(wù)器[9]。P2P的最大特點(diǎn)就是用戶之間直接共享資源,使得PC不再是被動(dòng)的客戶端,而成為具有服務(wù)器和客戶端雙重特征的設(shè)備。目前P2P的構(gòu)架手段主要有集中目錄式P2P、純P2P和混合P2P模式三種,如圖2.5從左至右所示。集中目錄式P2P是最早出現(xiàn)的P2P應(yīng)用模式,也稱為非純粹的P2P結(jié)構(gòu),仍然具有中心化的特點(diǎn),用于共享MP3音樂文件的Napster是最典型的代表。在這種模型中,所有的節(jié)點(diǎn)都和中心目錄服務(wù)器建立連接,中心目錄服務(wù)器負(fù)責(zé)所有節(jié)點(diǎn)的內(nèi)容,當(dāng)節(jié)點(diǎn)發(fā)出請(qǐng)求時(shí),中心目錄服務(wù)器會(huì)根據(jù)節(jié)點(diǎn)的請(qǐng)求找出符合該節(jié)點(diǎn)要求的節(jié)點(diǎn),然后文件交換就直接在這兩個(gè)節(jié)點(diǎn)之間進(jìn)行。純P2P模型完全沒有了索引的概念,資源隨機(jī)地分布在系統(tǒng)中所有的節(jié)點(diǎn)中,每個(gè)節(jié)點(diǎn)的請(qǐng)求都會(huì)廣播給所有和它直接相連的節(jié)點(diǎn),如果這些節(jié)點(diǎn)中都沒有所請(qǐng)求的文件,這些節(jié)點(diǎn)會(huì)把這個(gè)請(qǐng)求繼續(xù)廣播給所有和他們直接相連的節(jié)點(diǎn),直到找到所請(qǐng)求的文件或者廣播的次數(shù)超過了某個(gè)值?;旌鲜絇2P吸取了中心化P2P和純P2P的優(yōu)點(diǎn),選擇性能(處理、存儲(chǔ)、帶寬等方面)較高的節(jié)點(diǎn)作為超級(jí)節(jié)點(diǎn),在各個(gè)超級(jí)節(jié)點(diǎn)上存儲(chǔ)了系統(tǒng)中其他部分結(jié)點(diǎn)的信息?;旌鲜絇2P中,搜索數(shù)據(jù)包僅在超級(jí)節(jié)點(diǎn)之間轉(zhuǎn)發(fā),由超級(jí)節(jié)點(diǎn)將搜索請(qǐng)求轉(zhuǎn)發(fā)給適當(dāng)?shù)娜~子節(jié)點(diǎn)。3.2TCP/IP協(xié)議和OSI模型3.2.1OSI模型OSI(OpenSystemsInterconnection),即開放式通信系統(tǒng)互聯(lián)參考模型,是國際標(biāo)準(zhǔn)化組織(ISO)提出的一個(gè)試圖使各種計(jì)算機(jī)在世界范圍內(nèi)互連為網(wǎng)絡(luò)的標(biāo)準(zhǔn)框架。OSI定義了開放系統(tǒng)的層次結(jié)構(gòu)、層次之間的相互關(guān)系以及各層所包括的可能的任務(wù),它本身并不是一個(gè)標(biāo)準(zhǔn),而是一個(gè)在制定標(biāo)準(zhǔn)時(shí)使用的概念性框架,是作為一個(gè)框架來協(xié)調(diào)和組織各層所提供的服務(wù)的[10]。OSI模型由7個(gè)層組成,每一層都處理特定的通信任務(wù)。如圖2.6所示。在單臺(tái)機(jī)器中,每一層通過兩層間的層間接口調(diào)用下一層的服務(wù),取出對(duì)該層有意義的數(shù)據(jù);機(jī)器之間則是使用某個(gè)給定層的協(xié)議的對(duì)等進(jìn)程進(jìn)行通信[11]。這種通信由一些協(xié)議來控制,協(xié)議就是實(shí)現(xiàn)雙方都同意的一組規(guī)則和約定。對(duì)等進(jìn)程是指每一個(gè)機(jī)器的某個(gè)給定層上進(jìn)行通信的進(jìn)程。3.2.2TCP/IP協(xié)議TCP/IP(TransmissionControlProtocol/InternetProtocol),即傳輸控制協(xié)議/互聯(lián)網(wǎng)絡(luò)協(xié)議,是美國的國防部高級(jí)計(jì)劃研究局DARPA為實(shí)現(xiàn)ARPANET(后來發(fā)展為Internet)互連網(wǎng)而開發(fā)的。該協(xié)議是Internet國際互聯(lián)網(wǎng)絡(luò)的基礎(chǔ)和事實(shí)上的標(biāo)準(zhǔn),其規(guī)范了網(wǎng)絡(luò)上的所有通信設(shè)備,尤其是兩臺(tái)主機(jī)之間的數(shù)據(jù)往來格式以及傳送方式[12]。TCP/IP協(xié)議由應(yīng)用層、傳輸層(TCP)、網(wǎng)絡(luò)層(IP)和數(shù)據(jù)鏈路層(包括物理層)四層組成,與OSI模型的對(duì)應(yīng)關(guān)系如圖2.7所示。在物理和數(shù)據(jù)鏈路層中TCP/IP并沒有定義任何特定的協(xié)議,它支持所有標(biāo)準(zhǔn)的和專用的協(xié)議。網(wǎng)絡(luò)層提供主機(jī)到主機(jī)的通信服務(wù),負(fù)責(zé)將分組從發(fā)送主機(jī)送到接收主機(jī)。網(wǎng)絡(luò)層通過選路算法和協(xié)議為分組選擇通過通信子網(wǎng)最適當(dāng)?shù)穆窂?,并通過路由器的將數(shù)據(jù)報(bào)從源主機(jī)轉(zhuǎn)發(fā)到目的地主機(jī)。傳輸層的作用是將兩個(gè)端系統(tǒng)間的IP交付服務(wù)擴(kuò)展為運(yùn)行在兩個(gè)端系統(tǒng)上的進(jìn)程之間的交付服務(wù),提供進(jìn)程邏輯通信功能[13]。傳輸層協(xié)議是在端系統(tǒng)而不是在路由器中實(shí)現(xiàn)的,其中包括UDP和TCP。應(yīng)用層為不同的端系統(tǒng)提供通過計(jì)算機(jī)網(wǎng)絡(luò)交換報(bào)文互相通信的功能。應(yīng)用層協(xié)議定義了進(jìn)程間交換的報(bào)文格式和順序,以及傳輸和接收到報(bào)文時(shí)采取的動(dòng)作,其中包括交換的報(bào)文類型、報(bào)文類型的語法、字段的語義、報(bào)文響應(yīng)規(guī)則等[14]。3.2.3套接字WinSock是一套開放的、支持多種協(xié)議的Windows網(wǎng)絡(luò)編程接口,是Windows網(wǎng)絡(luò)編程事實(shí)上的標(biāo)準(zhǔn)。應(yīng)用程序通過WinSockAPI設(shè)計(jì)通信程序,WinSock利用網(wǎng)絡(luò)通信協(xié)議和操作系統(tǒng)調(diào)用完成實(shí)際的通信工作。(1)套接字基本概念套接字(socket)是內(nèi)核對(duì)象中的一種通信結(jié)構(gòu),它提供網(wǎng)絡(luò)進(jìn)程間的數(shù)據(jù)通信功能。形象上說套接字就是進(jìn)程的門戶[15]。套接字地址是套接字通信結(jié)構(gòu)的描述和定義。套接字描述符就是一個(gè)整數(shù)類型的值,在Windows中的類型是SOCKET。套接字描述符實(shí)質(zhì)是某套接字內(nèi)核對(duì)象的一個(gè)“句柄”,套接字描述符所在的進(jìn)程則通過該“句柄”訪問和操作該套接字。每個(gè)進(jìn)程的進(jìn)程空間里都有一個(gè)套接字描述符表,該表中存放著套接字描述符和套接字?jǐn)?shù)據(jù)結(jié)構(gòu)的對(duì)應(yīng)關(guān)系。該表中有一個(gè)字段存放新創(chuàng)建的套接字的描述符,另一個(gè)字段存放套接字?jǐn)?shù)據(jù)結(jié)構(gòu)的地址。因此根據(jù)套接字描述符就可以找到其對(duì)應(yīng)的套接字?jǐn)?shù)據(jù)結(jié)構(gòu)。每個(gè)進(jìn)程在自己的進(jìn)程空間里都有一個(gè)套接字描述符表,但是套接字?jǐn)?shù)據(jù)結(jié)構(gòu)都是在操作系統(tǒng)的內(nèi)核緩沖里,可供多個(gè)進(jìn)程使用。(2)套接字通信模式和I/O模式Windows套接字執(zhí)行I/O操作可以設(shè)定為鎖定或非鎖定模式。在鎖定模式下,在I/O操作完成前執(zhí)行操作的Winsock函數(shù)(如send和racy)會(huì)一直等待下去,而不會(huì)返回并將控制權(quán)交給程序。在非鎖定模式下無論結(jié)果如何,Winsock函數(shù)的調(diào)用都會(huì)立即返回。因此,這種套接字需要選擇一種I/O模型來幫助應(yīng)用程序判斷一個(gè)套接字何時(shí)可供讀寫。Windows操作系統(tǒng)提供了五種套接字I/O模型,分別為選擇(Select)、異步消息(WSAAsyncSelect)、事件通知(WSAEventSelect)、重疊I/O(OverlappedI/O)和完成端口(CompletionPort)模型[16][17]。Select模型是Winsock中最常見的I/O模型。通過調(diào)用Select函數(shù)可確定一個(gè)或多個(gè)套接字的狀態(tài),判斷套接字上是否存在數(shù)據(jù),或者能否向一個(gè)套接字寫入數(shù)據(jù)。它既能防止應(yīng)用程序在套接字處于阻塞模式時(shí),在一次I/O操作后被阻塞,同時(shí)也防止在套接字處于非鎖定模式時(shí),產(chǎn)生WSAEWOULDBLOCK錯(cuò)誤,提示請(qǐng)求的操作在調(diào)用期間沒有時(shí)間完成。WSAAsyncSelect模型也是一個(gè)常用的異步I/O模型。利用這個(gè)模型,應(yīng)用程序可在一個(gè)套接字上接受以Windows消息為基礎(chǔ)的網(wǎng)絡(luò)事件通知。該模型的實(shí)現(xiàn)方法是通過調(diào)用WSAAsyncSelect函數(shù)自動(dòng)將套接字設(shè)置為非阻塞模式,并向WinsockDLL注冊(cè)一個(gè)或多個(gè)感興趣的網(wǎng)絡(luò)事件,并提供一個(gè)通知時(shí)使用的窗口句柄,當(dāng)網(wǎng)絡(luò)事件發(fā)生時(shí),對(duì)應(yīng)的窗口將收到一個(gè)基于消息的通知。WSAEventSelect模型是Winsock提供的另一個(gè)有用的異步I/O模型,它允許應(yīng)用程序在一個(gè)或多個(gè)套接字上,接收以事件為基礎(chǔ)的網(wǎng)絡(luò)事件通知。該模型的關(guān)鍵是網(wǎng)絡(luò)事件會(huì)被發(fā)送到一個(gè)事件句柄,而不是發(fā)送到一個(gè)窗口。OverlappedI/O模型可以使應(yīng)用程序達(dá)到更佳的性能。它的基本原理是讓應(yīng)用程序使用一個(gè)重疊的數(shù)據(jù)結(jié)構(gòu),一次投遞一個(gè)或多個(gè)WinsockI/O請(qǐng)求,針對(duì)那些提交的請(qǐng)求,在它們完成之后,應(yīng)用程序可為他們提供服務(wù)。CompletionPort模型是迄今為止最為復(fù)雜的一種I/O模型。假如要為WindowsNT或Windows2000開發(fā)高性能的服務(wù)器應(yīng)用,希望同時(shí)為數(shù)百乃至上千個(gè)套接字I/O請(qǐng)求提供服務(wù)(如Web服務(wù)器),那么I/O完成端口模型便是最佳選擇,其可以達(dá)到最佳的系統(tǒng)性能!隨著系統(tǒng)內(nèi)安裝的CPU數(shù)量的增多,應(yīng)用程序的性能也可以線性提升。(3)I/O模型的選擇和性能提高開發(fā)服務(wù)器應(yīng)用時(shí),一般需要同時(shí)管理多個(gè)套接字,因此采取重疊I/O模型是比較符合需求的;若需要同時(shí)管理成百上千的套接字,則需要考慮采用完成端口模型,以獲得更好的性能[16]。開發(fā)客戶機(jī)應(yīng)用時(shí),一般只需同時(shí)管理一個(gè)或幾個(gè)套接字,采用事件通知模型即可。若開發(fā)的是基于Windows窗口例程的程序,那么采用異步消息模型應(yīng)該是更好的選擇,該程序已經(jīng)具備了處理消息的能力。3.3程序采用的主要技術(shù)3.3.1線程由線程的內(nèi)核對(duì)象和線程堆棧兩部分組成。操作系統(tǒng)通過內(nèi)核對(duì)象對(duì)線程實(shí)施管理,其中存放了系統(tǒng)關(guān)于線程的統(tǒng)計(jì)信息。線程堆棧用于維護(hù)線程在執(zhí)行代碼時(shí)需要的所有函數(shù)參數(shù)和局部變量[21]。線程只有一個(gè)內(nèi)核對(duì)象和一個(gè)堆棧,保留的記錄很少,也只需很少的內(nèi)存,因此創(chuàng)建線程的開銷遠(yuǎn)比創(chuàng)建進(jìn)程少。在實(shí)際編程過程中應(yīng)根據(jù)實(shí)際情況設(shè)法通過增加線程來解決編程問題,而要盡量避免創(chuàng)建新的進(jìn)程。線程分為兩種:用戶接口線程和輔助線程。用戶接口線程常用于接收用戶的輸入,處理相應(yīng)的事件和消息。輔助線程編程較為簡(jiǎn)單,一個(gè)基本函數(shù)代表一個(gè)線程,創(chuàng)建并啟動(dòng)線程后,則線程進(jìn)入運(yùn)行狀態(tài)。進(jìn)程的主線程在任何時(shí)候都可以創(chuàng)建新的線程,當(dāng)線程執(zhí)行完成任務(wù)后,自動(dòng)中止線程;當(dāng)進(jìn)程結(jié)束后,所有的線程都中止[22]。所有活動(dòng)的線程共享進(jìn)程的資源。3.3.2客戶/服務(wù)器程序設(shè)計(jì)范式是在設(shè)計(jì)C/S網(wǎng)絡(luò)通信控制或者數(shù)據(jù)交互的應(yīng)用中總結(jié)出來的一些具有代表性的、可以給其它程序設(shè)計(jì)提供范例的程序設(shè)計(jì)框架,在實(shí)際應(yīng)用中具有指導(dǎo)和規(guī)范作用。該類程序的客戶程序的編寫通常比服務(wù)器程序容易些,因?yàn)榭蛻糁羞M(jìn)程或者線程的控制要少得多。因此,設(shè)計(jì)范式主要也是針對(duì)服務(wù)器程序的設(shè)計(jì),主要分為迭代服務(wù)器和并發(fā)服務(wù)器兩大類[24][25]。(1)迭代服務(wù)器迭代服務(wù)器(IterativeServer)的工作模式是在一個(gè)循環(huán)中依次完成每個(gè)客戶的請(qǐng)求完成后再執(zhí)行一個(gè)循環(huán)的工作過程。該模式總是在處理完某個(gè)客戶的請(qǐng)求之后才轉(zhuǎn)向下一個(gè)客戶,在執(zhí)行某任務(wù)期間不會(huì)偵聽和處理其它任何任務(wù)。其依次執(zhí)行接受連接、處理請(qǐng)求、關(guān)閉連接、等待下一個(gè)連接四個(gè)循環(huán)步驟。這樣的服務(wù)器程序比較少見,其中沒有進(jìn)行任何的進(jìn)程或線程控制。(2)并發(fā)服務(wù)器,每個(gè)客戶一個(gè)進(jìn)程該并發(fā)服務(wù)器(ConcurrentServer)直接派生子進(jìn)程來處理每個(gè)客戶,服務(wù)器通過多個(gè)子進(jìn)程同時(shí)為多個(gè)客戶服務(wù)。客戶數(shù)目的唯一限制是操作系統(tǒng)對(duì)于以其名義運(yùn)行服務(wù)器的用戶ID能夠同時(shí)擁有多少子進(jìn)程的限制。其缺點(diǎn)是該并發(fā)服務(wù)器需要耗費(fèi)大量CPU時(shí)間為每個(gè)客戶現(xiàn)場(chǎng)派生一個(gè)子進(jìn)程。隨著網(wǎng)絡(luò)應(yīng)用的爆發(fā)式增長,這種模式的服務(wù)器顯得無法適應(yīng)現(xiàn)代的需要。該模式的增強(qiáng)模式就是采取預(yù)先派生子進(jìn)程技術(shù),在啟動(dòng)階段就派生一定數(shù)量的子進(jìn)程,當(dāng)每個(gè)客戶連接到達(dá)時(shí),這些子進(jìn)程立即就能提供服務(wù)。這種技術(shù)的優(yōu)點(diǎn)在于無須引入父進(jìn)程執(zhí)行派生進(jìn)程的開銷就能處理新到的客戶,缺點(diǎn)是父進(jìn)程必須在服務(wù)器啟動(dòng)階段猜測(cè)需要預(yù)先派生多少子進(jìn)程,以避免造成子進(jìn)程數(shù)量過多造成計(jì)算機(jī)資源浪費(fèi)或者數(shù)量不夠?qū)е潞罄m(xù)連接的客戶端無法正常工作。(3)并發(fā)服務(wù)器,每個(gè)客戶一個(gè)線程該類服務(wù)器為每個(gè)客戶創(chuàng)建一個(gè)線程,以減少為每個(gè)客戶派生子進(jìn)程的第二章系統(tǒng)程序設(shè)計(jì)思想和方法15資源消耗,因?yàn)橐粋€(gè)線程占用的資源遠(yuǎn)比一個(gè)子進(jìn)程占用的資源要少得多。程序設(shè)計(jì)中也可以在服務(wù)器啟動(dòng)階段預(yù)先創(chuàng)建一個(gè)線程池以取代為每個(gè)客戶現(xiàn)場(chǎng)創(chuàng)建一個(gè)線程的做法以提高性能加速。在等待客戶端連接時(shí)則可以每個(gè)線程各自accept,其中采用互斥鎖保護(hù),也可以由主線程統(tǒng)一accept。本程序的設(shè)計(jì)是采取由主線程統(tǒng)一accept并創(chuàng)建工作線程的。在并發(fā)服務(wù)器中選擇進(jìn)程還是線程來設(shè)計(jì)需要根據(jù)實(shí)際的情況決定。進(jìn)程是一種代價(jià)昂貴的東西,它們?cè)趩?dòng)、清除、被操作系統(tǒng)追蹤記錄等方面都需要消耗大量的CPU時(shí)間。進(jìn)程和線程之間的代價(jià)幾乎相差2~3個(gè)數(shù)量級(jí)。系統(tǒng)同時(shí)存在500個(gè)線程猶有可能,但同時(shí)存在500個(gè)進(jìn)程絕無可能。每秒鐘產(chǎn)生和摧毀許多個(gè)線程是可能的,每秒鐘產(chǎn)生和摧毀許多個(gè)進(jìn)程則是不可能的。但是進(jìn)程的安全性和穩(wěn)定性更強(qiáng),子進(jìn)程崩潰并不影響主進(jìn)程的正常運(yùn)行,而進(jìn)程中的一個(gè)線程出現(xiàn)問題則就會(huì)導(dǎo)致該進(jìn)程的垮掉[26]。3.4MySQL簡(jiǎn)介MySQL是最流行的開放源碼SQL數(shù)據(jù)庫管理系統(tǒng),它是由MySQLAB公司開發(fā)、發(fā)布并支持的。MySQLAB是由多名MySQL開發(fā)人創(chuàng)辦的一家商業(yè)公司。它是一家第二代開放源碼公司,結(jié)合了開放源碼價(jià)值取向、方法和成功的商業(yè)模型。在MySQL的網(wǎng)站(/)上,給出了關(guān)于MySQL和MySQL的最新信息。(1)MySQL是一種數(shù)據(jù)庫管理系統(tǒng)。數(shù)據(jù)庫是數(shù)據(jù)的結(jié)構(gòu)化集合。它可以是任何東西,從簡(jiǎn)單的購物清單到畫展,或企業(yè)網(wǎng)絡(luò)中的海量信息。要想將數(shù)據(jù)添加到數(shù)據(jù)庫,或訪問、處理計(jì)算機(jī)數(shù)據(jù)庫中保存的數(shù)據(jù),需要使用數(shù)據(jù)庫管理系統(tǒng),如MySQL服務(wù)器。計(jì)算機(jī)是處理大量數(shù)據(jù)的理想工具,因此,數(shù)據(jù)庫管理系統(tǒng)在計(jì)算方面扮演著關(guān)鍵的中心角色,或是作為獨(dú)立的實(shí)用工具,或是作為其他應(yīng)用程序的組成部分。(2)MySQL是一種關(guān)聯(lián)數(shù)據(jù)庫管理系統(tǒng)。關(guān)聯(lián)數(shù)據(jù)庫將數(shù)據(jù)保存在不同的表中,而不是將所有數(shù)據(jù)放在一個(gè)大的倉庫內(nèi)。這樣就增加了速度并提高了靈活性。MySQL的SQL指得是“結(jié)構(gòu)化查詢語言”。SQL是用于訪問數(shù)據(jù)庫的最常用標(biāo)準(zhǔn)化語言,它是由ANSI/ISOSQL標(biāo)準(zhǔn)定義的。SQL標(biāo)準(zhǔn)自1986年以來不斷演化發(fā)展,有數(shù)種版本。在本手冊(cè)中,“SQL-92”指得是1992年發(fā)布的標(biāo)準(zhǔn),“SQL:1999”指得是1999年發(fā)布的標(biāo)準(zhǔn),“SQL:2003”指得是標(biāo)準(zhǔn)的當(dāng)前版本。我們采用術(shù)語“SQL標(biāo)準(zhǔn)”標(biāo)示SQL標(biāo)準(zhǔn)的當(dāng)前版本。(3)MySQL軟件是一種開放源碼軟件。“開放源碼”意味著任何人都能使用和改變軟件。任何人都能從Internet下載MySQL軟件,而無需支付任何費(fèi)用。如果愿意,你可以研究源碼并進(jìn)行恰當(dāng)?shù)母?,以滿足你自己的需求。MySQL軟件采用了GPL(GNU通用公共許可證),/licenses/,定義了在不同情況下可以用軟件作的事和不可作的事。如果你對(duì)GPL不滿意,或需要在商業(yè)應(yīng)用程序中嵌入MySQL代碼,可從我方購買商業(yè)許可版本。更多信息,請(qǐng)參見MySQL許可概述(/company/legal/licensing/)。(4)MySQL數(shù)據(jù)庫服務(wù)器具有快速、可靠和易于使用的特點(diǎn)。如果它正是你所尋找的,不妨一試。MySQL服務(wù)器還有一套實(shí)用的特性集合,這些特性是通過與我們用戶的密切合作而開發(fā)的。在我們的基準(zhǔn)測(cè)試主頁上,給出了MySQL服務(wù)器和其他數(shù)據(jù)庫管理器的比較結(jié)果。請(qǐng)參見\o"7.1.4.

TheMySQLBenchmarkSuite"7.1.4“MySQL基準(zhǔn)套件”。MySQL服務(wù)器最初是為處理大型數(shù)據(jù)庫而開發(fā)的,與已有的解決方案相比,它的速度更快,多年以來,它已成功用于眾多要求很高的生產(chǎn)環(huán)境。盡管MySQL始終在不斷發(fā)展,但目前MySQL服務(wù)器已能提供豐富和有用的功能。它具有良好的連通性、速度和安全性,這使的MySQL十分適合于訪問Internet上的數(shù)據(jù)庫。(5)MySQL服務(wù)器工作在客戶端/服務(wù)器模式下,或嵌入式系統(tǒng)中。MySQL數(shù)據(jù)庫軟件是一種客戶端/服務(wù)器系統(tǒng),由支持不同后端的1個(gè)多線程SQL服務(wù)器,數(shù)種不同的客戶端程序和庫,眾多管理工具和廣泛的應(yīng)用編程接口API組成。我們還能以嵌入式多線程庫的形式提供MySQL服務(wù)器,你可以將其鏈接到你的應(yīng)用程序,從而獲得更小、更快、和更易管理的產(chǎn)品。4系統(tǒng)設(shè)計(jì)4.1總體設(shè)計(jì)本系統(tǒng)主要是模仿QQ聊天系統(tǒng)設(shè)計(jì)的一個(gè)基于C/S結(jié)構(gòu)的簡(jiǎn)單的聊天系統(tǒng)。系統(tǒng)采用的客戶/服務(wù)器摸式其基本結(jié)構(gòu)如圖所示:4.2系統(tǒng)功能設(shè)計(jì)本系統(tǒng)實(shí)現(xiàn)了簡(jiǎn)單的新用戶注冊(cè),用戶登陸,用戶直接根據(jù)號(hào)碼查找添加好友和根據(jù)在線的用戶信息查找來添加好友,同時(shí)可以查看在線的用戶信息,向在線的用戶發(fā)送消息,用戶接收消息等。系統(tǒng)功能圖如下所示:即時(shí)聊天系統(tǒng)即時(shí)聊天系統(tǒng)用戶登陸用戶注冊(cè)直接查找好友好友查找更新用戶信息更新用戶刪除好友信息查看發(fā)送信息接收信息4.3數(shù)據(jù)庫設(shè)計(jì)系統(tǒng)可以采用任何一種流行的Java支持的數(shù)據(jù)庫。本系統(tǒng)采用了MySQL作為后臺(tái)數(shù)據(jù)庫。通過對(duì)現(xiàn)在流行的聊天軟件ICQ進(jìn)行參考,建立數(shù)據(jù)庫,名為javaicq。數(shù)據(jù)庫共建立兩個(gè)表,一個(gè)是用戶的基本信息,包括呢稱及Jicq號(hào)碼等。一個(gè)是用戶的好友列表,包括用戶自己的號(hào)碼和好友的號(hào)碼。(1)用戶的基本信息表(表名icq)序號(hào) 字段名 含義 數(shù)據(jù)類型 NULL1 Icqno 用戶的號(hào)碼 int No2 Nickname 用戶的呢稱 Char No3 Password 用戶的密碼 Char No4 Status 用戶在線否 Bit No5 Ip 用戶的IP地址 Char Yes6 Info 用戶的資料 Varchar Yes7 Pic 用戶的頭像號(hào) Int Yes8 Sex 用戶性別 Char Yes9 Email 用戶的email Char Yes10 Place 用戶的籍貫 Char yes其中Icqno字段為自動(dòng)增加。(其他還可以添加諸如電話號(hào)碼等字段作為更多選擇)(2)用戶的好友表(表名friend)序號(hào) 字段名 含義 數(shù)據(jù)類型 NULL1 Icqno 用戶的號(hào)碼 Int No2 Friend 好友的號(hào)碼 Int No5詳細(xì)的設(shè)計(jì)與實(shí)現(xiàn)5.1服務(wù)器程序服務(wù)器與客戶間通過套接口Socket(TCP)連接。在java中使用套接口相當(dāng)簡(jiǎn)單,JavaAPI為處理套接口的通信提供了一個(gè)類.Socket.,使得編寫網(wǎng)絡(luò)應(yīng)用程序相對(duì)容易.服務(wù)器采用多線程以滿足多用戶的請(qǐng)求,通過JDBC與后臺(tái)數(shù)據(jù)庫連接,并通過創(chuàng)建一個(gè)ServerSocket對(duì)象來監(jiān)聽來自客戶的連接請(qǐng)求,默認(rèn)端口為8080,然后無限循環(huán)調(diào)用accept()方法接受客戶程序的連接。具體實(shí)現(xiàn)代碼如下所示:classServerThreadextendsThread{//繼承線程privateSocketsocket;//定義套接口privateBufferedReaderin;//定義輸入流privatePrintWriterout;//定義輸出流intno;//定義申請(qǐng)的jicq號(hào)碼intnumber;publicServerThread(Sockets,intnum)throwsIOException{//線程構(gòu)造函數(shù)number=num; socket=s;//取得傳遞參數(shù)in=newBufferedReader(newInputStreamReader(socket.getInputStream()));//創(chuàng)建輸入流out=newPrintWriter(newBufferedWriter(newOutputStreamWriter(socket.getOutputStream())),true);//創(chuàng)建輸出流start();//啟動(dòng)線程}publicvoidrun(){ //線程監(jiān)聽函數(shù)try{ while(true){Stringstr=in.readLine();//取得輸入字符串if(str.equals("end"))break;//如果是結(jié)束就關(guān)閉連接elseif(str.equals("login")){//如果是登錄 try{ Class.forName("com.mysql.jdbc.Driver"); Connectionc=DriverManager.getConnection("jdbc:mysql://localhost/javaicq","root","");Stringicqno=in.readLine();intg=Integer.parseInt(icqno);//取得輸入的jicq號(hào)碼Stringpasswd=in.readLine().trim();//取得輸入的密碼Stringsql="selectnickname,passwordfromicqwhereicqno='"+icqno+"'";Statementprepare=c.createStatement();ResultSetr=prepare.executeQuery(sql);//執(zhí)行數(shù)據(jù)庫查尋if(r.next()){//以下比較輸入的號(hào)碼于密碼是否相同Stringpass=r.getString("password").trim();//System.out.println(pass);if(passwd.regionMatches(0,pass,0,pass.length())){out.println("ok");Stringip=socket.getInetAddress().getHostAddress();Stringsetip="updateicqsetip='"+ip+"'whereicqno='"+icqno+"'";Statementprest=c.createStatement();intset=prest.executeUpdate(setip);Stringstatus="updateicqsetstatus=1whereicqno='"+icqno+"'";Statementset2=c.createStatement();set2.executeUpdate(status);System.out.println(set2);//setonline}//否者告訴客戶失敗elseout.println("false");r.close();c.close();}else{out.println("false");System.out.println("false");r.close();c.close();}}catch(Exceptione){e.printStackTrace();}socket.close();}//endlogin//登錄結(jié)束//以下為處理客戶的新建請(qǐng)求elseif(str.equals("new")){ number=number+1; try{ Class.forName("com.mysql.jdbc.Driver"); Connectionc2=DriverManager.getConnection("jdbc:mysql://localhost/javaicq","root","");//準(zhǔn)備接受用戶的呢稱,密碼,email,個(gè)人資料,籍貫,頭像等信息//PreparedStatementprepare2=c2.prepareCall(newsql);Stringnickname=in.readLine().trim();Stringpassword=in.readLine().trim();Stringemail=in.readLine().trim();Stringinfo=in.readLine().trim();Stringplace=in.readLine().trim();intpicindex=Integer.parseInt(in.readLine());Stringnewsql="insertintoicq(icqno,nickname,password,email,info,place,pic)values('"+number+"','"+nickname+"','"+password+"','"+email+"','"+info+"','"+place+"','"+picindex+"')";//intr3=prepare2.executeUpdate();//執(zhí)行數(shù)據(jù)庫添加Statementpre2=c2.createStatement();pre2.executeUpdate(newsql);Stringsql2="selecticqnofromicqwherenickname='"+nickname+"'";//以下告訴客戶其注冊(cè)的號(hào)碼Statementpre3=c2.createStatement();ResultSetr2=pre3.executeQuery(sql2);while(r2.next()){//out.println(r2.getInt(1));no=r2.getInt(1);System.out.println(no);}out.println(no);out.println("ok");c2.close();//完畢}catch(Exceptione){e.printStackTrace();out.println("false");}socket.close();}//endnew//新建用戶結(jié)束//以下處理用戶查找好友elseif(str.equals("find")){ try{ Class.forName("com.mysql.jdbc.Driver"); Connectionc3=DriverManager.getConnection("jdbc:mysql://localhost/javaicq","root",""); //以下連接數(shù)據(jù)庫,并且返回其他用戶的呢稱,性別,籍貫,個(gè)人資料等信息 Stringfind="selectnickname,sex,place,ip,email,infofromicq";Statementst=c3.createStatement();ResultSetresult=st.executeQuery(find);while(result.next()){out.println(result.getString("nickname"));out.println(result.getString("sex"));out.println(result.getString("place"));out.println(result.getString("ip"));out.println(result.getString("email"));out.println(result.getString("info"));}//whileendout.println("over");intd,x;booleany;//以下返回用戶的jicq號(hào)碼,頭像號(hào),及是否在線ResultSetiset=st.executeQuery("selecticqno,pic,statusfromicq");while(iset.next()){d=iset.getInt("icqno");out.println(d);x=iset.getInt("pic");//picinfoout.println(x);y=iset.getBoolean("status");if(y){out.println("1");}else{out.println("0");}//System.out.println(d);}iset.close();c3.close();result.close();}catch(Exceptione){e.printStackTrace();System.out.println("false");}//socket.close();}//endfind//查找好友結(jié)束//以下處理用戶登錄時(shí)讀取其好友資料elseif(str.equals("friend")){ try{ Class.forName("com.mysql.jdbc.Driver"); Connectionc4=DriverManager.getConnection("jdbc:mysql://localhost/javaicq","root",""); //以下連接好友表,返回用戶的好友名單inticqno=Integer.parseInt(in.readLine());System.out.println(icqno);//prepare4.setInt(1,icqno);Stringfriend="selectfriendfromfriendwhereicqno='"+icqno+"'";Statementpre4=c4.createStatement();ResultSetr4=pre4.executeQuery(friend);Vectorfriendno=newVector();//該矢量保存好友號(hào)碼while(r4.next()){friendno.add(newInteger(r4.getInt(1)));}//以下告訴客戶其好友的呢稱,號(hào)碼,ip地址,狀態(tài),頭像,個(gè)人資料等信息out.println(friendno.size());for(inti=0;i<friendno.size();i++){Stringfriendinfo="selectnickname,icqno,ip,status,pic,email,infofromicqwhereicqno='"+friendno.get(i)+"'";Statementpre5=c4.createStatement();ResultSetr5=pre5.executeQuery(friendinfo);booleanstatus;while(r5.next()){out.println(r5.getString("nickname"));out.println(r5.getInt("icqno"));out.println(r5.getString("ip"));status=r5.getBoolean("status");if(status)out.println("1");else{out.println("0");}out.println(r5.getInt("pic"));out.println(r5.getString("email"));out.println(r5.getString("info"));}//whiler5.close();}//for//發(fā)送完畢out.println("over");System.out.println("over");c4.close();r4.close();}catch(Exceptione){e.printStackTrace();System.out.println("false");}//socket.close();}//endfriend//讀取好友信息完畢//以下處理用戶添加好友elseif(str.equals("addfriend")){System.out.println("add");try{ Class.forName("com.mysql.jdbc.Driver"); Connectionc6=DriverManager.getConnection("jdbc:mysql://localhost/javaicq","root","");//連接數(shù)據(jù)庫,根據(jù)接受的用戶號(hào)碼及好友號(hào)碼向好友表添加記錄intfriendicqno=Integer.parseInt(in.readLine());System.out.println(friendicqno);intmyicqno=Integer.parseInt(in.readLine());System.out.println(myicqno);Stringaddfriend="insertintofriendvalues('"+myicqno+"','"+friendicqno+"')";Statementpre6=c6.createStatement();intr6=0;//r6=prepare6.executeUpdate();r6=pre6.executeUpdate(addfriend);if(r6==1)System.out.println("okaddfrien");elseSystem.out.println("falseaddfriend");}catch(Exceptione){e.printStackTrace();System.out.println("false");}//socket.close();System.out.println("overaddfriend");}//endaddfriend//用戶添加好友結(jié)束//addnewfriendwhoaddme//以下處理其他用戶如果加我,我就加他elseif(str.equals("addnewfriend")){System.out.println("add");try{ Class.forName("com.mysql.jdbc.Driver"); Connectionc6=DriverManager.getConnection("jdbc:mysql://localhost/javaicq","root",""); //連接數(shù)據(jù)庫,根據(jù)接受的用戶號(hào)碼及好友號(hào)碼向好友表添加記錄intfriendicqno=Integer.parseInt(in.readLine());System.out.println(friendicqno);intmyicqno=Integer.parseInt(in.readLine());System.out.println(myicqno);Stringaddfriend="insertintofriendvalues('"+myicqno+"','"+friendicqno+"')";Statementpre6=c6.createStatement();intr6=0;r6=pre6.executeUpdate(addfriend);if(r6==1)System.out.println("okaddfriend");elseSystem.out.println("falseaddfriend");Stringfriendinfo="selectnickname,icqno,ip,status,pic,email,infofromicqwhereicqno='"+friendicqno+"'";//如果成功,就向用戶傳遞好友的基本信息,比如呢稱等Statementpre5=c6.createStatement();ResultSetr5=pre5.executeQuery(friendinfo);booleanstatus;while(r5.next()){System.out.println("dsf");out.println(r5.getString("nickname"));out.println(r5.getInt("icqno"));out.println(r5.getString("ip"));status=r5.getBoolean("status");if(status)out.println("1");else{out.println("0");}out.println(r5.getInt("pic"));out.println(r5.getString("email"));out.println(r5.getString("info"));}//whileout.println("over");r5.close();c6.close();}catch(Exceptione){e.printStackTrace();System.out.println("false");}System.out.println("overaddnewfriend");}//endaddfriend友elseif(str.equals("delfriend")){System.out.println("del");try{ Class.forName("com.mysql.jdbc.Driver"); Connectionc7=DriverManager.getConnection("jdbc:mysql://localhost/javaicq","root","");//連接數(shù)據(jù)庫,根據(jù)接受的用戶號(hào)碼及好友號(hào)碼向好友表刪除記錄intfriendicqno=Integer.parseInt(in.readLine());System.out.println(friendicqno);intmyicqno=Integer.parseInt(in.readLine());System.out.println(myicqno);Stringaddfriend="deletefromfriendwhereicqno='"+myicqno+"'andfriend='"+friendicqno+"'";Statementpre7=c7.createStatement();intr7=0;r7=pre7.executeUpdate(addfriend);if(r7==1)System.out.println("okdelfrien");//成功elseSystem.out.println("falsedelfriend");//失敗}catch(Exceptione){e.printStackTrace();System.out.println("delfalse");}}//enddeletefriend//執(zhí)行用戶刪除好友結(jié)束elseif(str.equals("logout")){ try{Class.forName("com.mysql.jdbc.Driver"); Connectionc8=DriverManager.getConnection("jdbc:mysql:

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論