基于Java的語(yǔ)音通信軟件_第1頁(yè)
基于Java的語(yǔ)音通信軟件_第2頁(yè)
基于Java的語(yǔ)音通信軟件_第3頁(yè)
基于Java的語(yǔ)音通信軟件_第4頁(yè)
基于Java的語(yǔ)音通信軟件_第5頁(yè)
已閱讀5頁(yè),還剩38頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

前言隨著互聯(lián)網(wǎng)的快速發(fā)展,在線通信軟件已成為越來(lái)越多的互聯(lián)網(wǎng)用戶(hù)喜愛(ài)的共享信息的重要工具。今天,有很多優(yōu)秀的即時(shí)通信軟件,如微信,騰訊QQ,MSN,Messenger等,個(gè)人或組織或公司都可以滿足通信需求,同時(shí)支持傳統(tǒng)的通信方式,如電話,傳真和電子郵件。傳統(tǒng)的通信方式雖然也在不斷上升發(fā)展,但這顯然不滿足專(zhuān)業(yè)交流的要求。隨著三種現(xiàn)代信息技術(shù)軟件、網(wǎng)絡(luò)和通信的發(fā)展,將出現(xiàn)更實(shí)用,更快速的即時(shí)消息服務(wù)以及其他通信和協(xié)作工具,這將繼電話和電子郵件之后完全融入到每個(gè)人的生活之中。Java編程語(yǔ)言是Sun公司開(kāi)發(fā)的新一代編程語(yǔ)言。它可以在具有多臺(tái)機(jī)器和不同操作平臺(tái)的網(wǎng)絡(luò)環(huán)境中開(kāi)發(fā)軟件。無(wú)論任何瀏覽器,你使用的計(jì)算機(jī)類(lèi)型以及你使用的操作系統(tǒng),只要瀏覽器顯示“Java支持”,你就可以顯示閃亮的起始頁(yè)面。Java正在成為Internet應(yīng)用程序的主要開(kāi)發(fā)語(yǔ)言。它從根本上改變了應(yīng)用程序的開(kāi)發(fā)方式,帶來(lái)了PC機(jī)的新技術(shù)革命,并為快速變化的信息世界增添了新的活力。而本文所設(shè)計(jì)的基于Java的語(yǔ)音通信軟件,它是面向個(gè)人而開(kāi)發(fā)的大眾化聊天軟件,界面操作簡(jiǎn)單、易用,只需要聯(lián)網(wǎng)就能與對(duì)方進(jìn)行文字、語(yǔ)音通信,支持表情符號(hào),可以滿足人們?cè)诰W(wǎng)絡(luò)中交流的需要。并且聊天軟件與電話和手機(jī)相比,具有成本低、功能強(qiáng)大、便捷等優(yōu)點(diǎn)。本文旨在介紹如何使用Java語(yǔ)言構(gòu)建一個(gè)即時(shí)通信系統(tǒng),并實(shí)現(xiàn)一些基本的語(yǔ)音變化和特效,給用戶(hù)帶來(lái)不一樣的體驗(yàn)。1緒論1.1課題研究背景即時(shí)通信(IM)它指的是可以即時(shí)發(fā)送和接收Internet消息的服務(wù)REF_Ref516069647\r\h錯(cuò)誤!未找到引用源。。自1998年誕生以來(lái),即時(shí)通信已經(jīng)變得越來(lái)越普遍,逐漸整合各種功能,如電子郵件,博客,音樂(lè),電視,游戲和研究。即時(shí)消息不再是在線討論的簡(jiǎn)單工具。它是一個(gè)綜合的信息平臺(tái),結(jié)合了通信,信息,娛樂(lè),研究,電子商務(wù),辦公室協(xié)作和客戶(hù)服務(wù)。盡管即時(shí)通信軟件的歷史并非如此,但其實(shí)用性很快受到所有人的歡迎,并且在全世界都很受歡迎。在其發(fā)展史上。以色列人是不可替代的。1996年7月,有四名年輕的以色列人創(chuàng)立了Mirabilis,并于同年開(kāi)始了世界上第一次ICQ信息交流。ICQ目前正在運(yùn)行,它仍然在全球IM市場(chǎng)中發(fā)揮著重要作用。目前,面向中國(guó)市場(chǎng)的本地網(wǎng)絡(luò)聊天軟件主要包括:騰訊QQ、微信、百度Hi、網(wǎng)易泡泡、盛大圈圈、淘寶旺旺等。騰訊QQ,微信等網(wǎng)絡(luò)聊天軟件不是一個(gè)簡(jiǎn)單的在線討論工具。它將是一個(gè)綜合的信息平臺(tái),結(jié)合了通信,信息,娛樂(lè),研究,電子商務(wù),辦公室協(xié)作和客戶(hù)服務(wù)。這是一種將設(shè)備連接到即時(shí)消息網(wǎng)絡(luò)的服務(wù),即時(shí)通信與電子郵件的不同之處在于會(huì)話立即發(fā)生。大多數(shù)即時(shí)消息服務(wù)提供狀態(tài)信息,例如:聯(lián)系人列表,聯(lián)系人是否在線,以及是否可以與聯(lián)系人通信。實(shí)時(shí)語(yǔ)音通信技術(shù)的發(fā)展更是給即時(shí)通信軟件帶來(lái)了顛覆性的改變,微信之所以能成為目前國(guó)內(nèi)通信軟件的巨頭,很大一部分原因是因?yàn)樗膶?shí)時(shí)語(yǔ)音功能。當(dāng)初,微信靠便捷的語(yǔ)音對(duì)話功能,給很多不會(huì)用騰訊QQ的中老年人帶來(lái)了巨大的便利,一來(lái)他們省去了很多打字學(xué)習(xí)的時(shí)間成本,二來(lái)節(jié)省了他們的金錢(qián)成本,微信由此打開(kāi)了一個(gè)新的市場(chǎng)。由此可見(jiàn),實(shí)時(shí)語(yǔ)音通信技術(shù)的重要性不言而喻。1.2課題研究現(xiàn)狀目前,中國(guó)即時(shí)通信工具可根據(jù)其用途分為兩類(lèi)。第一類(lèi)是個(gè)人即時(shí)通信軟件,騰訊QQ、微信、泡泡網(wǎng)易、淘寶旺旺等。騰訊QQ它于1999年2月首次發(fā)布,而今天,它幾乎在在線即時(shí)通訊軟件市場(chǎng)上被壟斷。騰訊QQ能提供短信息、語(yǔ)音、視頻通話和文件傳輸功能等。另一種類(lèi)型是企業(yè)級(jí)通信軟件。如:E通話、、UcSTAR、商務(wù)通等。隨著功能的增加,以下功能正變得越來(lái)越普遍,例如對(duì)應(yīng)用程序的增強(qiáng),尤其是即時(shí)語(yǔ)音消息傳遞。IP電話,電信服務(wù)已經(jīng)逐漸被替換,這導(dǎo)致傳統(tǒng)運(yùn)營(yíng)商采取行動(dòng)想解決這個(gè)問(wèn)題。2006年,中國(guó)電信推出了自己的即時(shí)通信工具飛信。中國(guó)聯(lián)通也推出了自己的“超級(jí)簡(jiǎn)報(bào)”,但由于通信市場(chǎng)早已被幾家大的通信軟件蠶食,用戶(hù)不再使用這些傳統(tǒng)產(chǎn)品?;诰钟蚓W(wǎng)的即時(shí)語(yǔ)音通信功能實(shí)際上是因特網(wǎng)上的即時(shí)通信功能的較小版本。通過(guò)因特網(wǎng)進(jìn)行即時(shí)通信的裝置通常使用UDP或TCP協(xié)議系統(tǒng)來(lái)實(shí)現(xiàn)。與之前的ICQ相比,技術(shù)開(kāi)發(fā)相對(duì)成熟。海外開(kāi)發(fā)產(chǎn)品MSNMessenger,YAHOO-Tong,國(guó)內(nèi)知名工具騰訊QQ,新浪UC,等都具有即時(shí)功能,可以通過(guò)全球網(wǎng)絡(luò)立即進(jìn)行通信。有一些獨(dú)特的功能,如消息傳遞,即時(shí)聊天,基本文件傳輸和大客戶(hù)端,自定義MSN表達(dá),以及QQ具有方便的屏幕捕獲功能。所有上述軟件都通過(guò)網(wǎng)絡(luò)實(shí)現(xiàn)實(shí)時(shí)視頻聊天和語(yǔ)音聊天功能。這些軟件具有自己的使用和實(shí)現(xiàn)優(yōu)勢(shì)。但是,因?yàn)樗鼈兪巧虡I(yè)上使用的,所以它們的實(shí)施方法是商業(yè)秘密,并且是不能實(shí)現(xiàn)的具體細(xì)節(jié)。這些不是什么大問(wèn)題,基于TCP/IP或UDP/IP協(xié)議的各種軟件接口是使用不同平臺(tái)上的不同網(wǎng)絡(luò)通信接口創(chuàng)建的。在局域網(wǎng)中,局域網(wǎng)的結(jié)構(gòu)比因特網(wǎng)更簡(jiǎn)單,因此實(shí)現(xiàn)這些功能比因特網(wǎng)更容易,但可用于了解網(wǎng)絡(luò)協(xié)議和原理,便于操作。1.3課題研究的內(nèi)容及意義21世紀(jì)是信息時(shí)代,隨著互聯(lián)網(wǎng)技術(shù)的發(fā)展,信息也占據(jù)了一個(gè)新的層面。目前,即時(shí)通信軟件是用于發(fā)送信息的最廣泛使用的應(yīng)用工具。它充當(dāng)即時(shí)通信工具,允許用戶(hù)從第一時(shí)刻開(kāi)始交換信息。在最近的快速發(fā)展之后,即時(shí)通信軟件已經(jīng)發(fā)展成為一個(gè)多元化的互聯(lián)網(wǎng)應(yīng)用平臺(tái)。即時(shí)通信軟件的出現(xiàn)使他們之間的溝通非常舒適。用戶(hù)可以使用即時(shí)通信軟件來(lái)增強(qiáng)信息和通信的交流,加快設(shè)計(jì)速度。隨著企業(yè)即時(shí)通信工具的推出,即時(shí)信息將在網(wǎng)絡(luò)營(yíng)銷(xiāo)中發(fā)揮越來(lái)越重要的作用。網(wǎng)絡(luò)通信系統(tǒng)具有各種實(shí)現(xiàn)方式,目前,信息交換是互聯(lián)網(wǎng)提供的主要場(chǎng)景,這也是點(diǎn)對(duì)點(diǎn)交流系統(tǒng)的一部分。還有一個(gè)基于中央套接字的聊天系統(tǒng),聊天服務(wù)器。本次軟件設(shè)計(jì)使用第二種方法,因?yàn)樗m用于局域網(wǎng)。此方法可以在本地網(wǎng)絡(luò)或Internet上使用。此次開(kāi)發(fā)的軟件適用于公司和學(xué)校,公司和學(xué)校有保密要求,學(xué)校和內(nèi)部網(wǎng)無(wú)法連接到Internet?;诰钟蚓W(wǎng)的即時(shí)通信軟件具有簡(jiǎn)單的管理,精密的用戶(hù)界面和穩(wěn)定的操作,以滿足內(nèi)部員工的通信需求,并促進(jìn)資源的轉(zhuǎn)移。你可以使用內(nèi)部網(wǎng)絡(luò)進(jìn)行通信,滿足內(nèi)部員工的保密需求。此次開(kāi)發(fā)的基于局域網(wǎng)的即時(shí)通信軟件主要實(shí)現(xiàn)用戶(hù)注冊(cè),登錄,語(yǔ)音聊天,傳輸文件等功能。例如,任何房間,辦公室,教室和樓層中的用戶(hù)都可以通過(guò)本地網(wǎng)絡(luò)上的該即時(shí)消息傳遞,通過(guò)此程序進(jìn)行通信?,F(xiàn)有聊天工具的抖動(dòng)或啟動(dòng)屏幕對(duì)用戶(hù)具有不良后果,所以不添加這些功能,這極大地促進(jìn)了日常生活和內(nèi)部工作。1.4各章節(jié)安排第一章,緒論。主要介紹國(guó)內(nèi)外即時(shí)通訊系統(tǒng)的研究現(xiàn)狀,即時(shí)通信軟件的前景,課題研究的內(nèi)容及意義,以及各章節(jié)的安排等。第二章,相關(guān)技術(shù)背景。是對(duì)Java、Socket網(wǎng)絡(luò)編程、TCP/IP協(xié)議、C/S模式、MySQL數(shù)據(jù)庫(kù)、JavaSound等相關(guān)知識(shí)的綜述。首先介紹Java語(yǔ)言的發(fā)展簡(jiǎn)史和特性,然后介紹Socket網(wǎng)絡(luò)編程原理,接著介紹實(shí)現(xiàn)網(wǎng)絡(luò)連接的TCP和用于音頻處理的JavaSoundAPI,然后介紹語(yǔ)音處理的相關(guān)知識(shí)等。第三章,基于Java的語(yǔ)音通信軟件需求分析。首先介紹個(gè)人需求分析,然后是業(yè)務(wù)需求分析,接著是性能需求分析、數(shù)據(jù)需求分析和功能要求分析。第四章,基于Java語(yǔ)音通信軟件的實(shí)現(xiàn)。本章在總體設(shè)計(jì)方案的基礎(chǔ)上,詳細(xì)描述了對(duì)各個(gè)功能模塊的具體開(kāi)發(fā)和實(shí)現(xiàn)過(guò)程。第五章,總結(jié)。本章闡述軟件開(kāi)發(fā)的經(jīng)驗(yàn)總結(jié)以及不足之處。2軟件開(kāi)發(fā)的相關(guān)技術(shù)及協(xié)議介紹2.1Java語(yǔ)言2.1.1Java發(fā)展簡(jiǎn)史自1990年以來(lái),硬件行業(yè)出現(xiàn)了新的商機(jī)。1991年,Sun成立了一個(gè)專(zhuān)注于家用計(jì)算機(jī)嵌入式應(yīng)用的項(xiàng)目團(tuán)隊(duì),以探索即將上市的單片機(jī)系統(tǒng)。項(xiàng)目團(tuán)隊(duì)對(duì)C++進(jìn)行了更改,刪除了不切實(shí)際且與安全相關(guān)的組件,并將它們與實(shí)時(shí)需求結(jié)合起來(lái),假設(shè)了一個(gè)簡(jiǎn)單的平臺(tái)系統(tǒng),滿足這些要求的材料形式為此目的,創(chuàng)建了結(jié)構(gòu)和相應(yīng)的規(guī)范。最后,開(kāi)發(fā)了一種叫做Oak的語(yǔ)言。Oak語(yǔ)言還創(chuàng)建了一個(gè)平臺(tái),可以根據(jù)指定的規(guī)范基于現(xiàn)有開(kāi)發(fā)執(zhí)行字節(jié)碼。Oak語(yǔ)言于1992年正式開(kāi)發(fā),但由于計(jì)算機(jī)制造商現(xiàn)在認(rèn)為制造設(shè)施風(fēng)險(xiǎn)太大,因此無(wú)法推出。直到1995年,Oak的語(yǔ)言提供了新的功能:用戶(hù)不必搜索靜態(tài)網(wǎng)頁(yè),但他們可以在所有平臺(tái)和互聯(lián)網(wǎng)上運(yùn)行的程序。因此,Sun公司重新設(shè)計(jì)Oak語(yǔ)言,因?yàn)樗梢钥缙脚_(tái)、占用內(nèi)存小、適用于網(wǎng)絡(luò)傳輸?shù)葍?yōu)點(diǎn)迅速崛起。當(dāng)年,Sun公司推出了用Java編寫(xiě)的可以嵌入網(wǎng)頁(yè)的Applet。Oak語(yǔ)言最后重命名為Java語(yǔ)言。JDK1.0于1996年1月發(fā)布.JDK是一個(gè)Java開(kāi)發(fā)工具包,它將Java定義為一個(gè)獨(dú)立的開(kāi)發(fā)工具。JDK1.1于1997年2月發(fā)布。J2EE于1998年12月8日發(fā)布。同年6月,同時(shí)發(fā)布了用于有限資源和移動(dòng)資源的J2ME,用于桌面環(huán)境的J2SE和JavaJ2EE應(yīng)用服務(wù)器。從那時(shí)起,Java應(yīng)用程序已經(jīng)變得普遍。2000年,Sun在J2SE1.4發(fā)布兩年后更新了JDK1.4,J2SE1.3和J2EE1.3JDK,為Java增加了近63%的類(lèi)和接口,取得了非常大的效果。2004年9月30日,J2SE1.5發(fā)布并重命名為JavaSE5.0。2005年,一些Java版本2被暫停。2006年,Sun宣布Java將開(kāi)放源代碼并發(fā)布該源代碼。甲骨文于2009年收購(gòu)Sun,2011年宣布推出Java7,并于2014年宣布甲骨文正式版Java8REF_Ref11026700\r\h錯(cuò)誤!未找到引用源。。2.1.2Java語(yǔ)言特性1,簡(jiǎn)單性Java與C++非常相似,但開(kāi)發(fā)人員為了使Java語(yǔ)言更簡(jiǎn)單,提供了break和continue語(yǔ)句以及異常處理。開(kāi)發(fā)人員還將C++類(lèi)的多繼承模式更改為唯一的繼承模式。所有Java都是沒(méi)有指針的對(duì)象。2,面向?qū)ο驤ava是一種完全面向?qū)ο蟮恼Z(yǔ)言。3,分布性Java是一種分布式語(yǔ)言,可用于描述分布式客戶(hù)端和服務(wù)器。4,編譯和解釋Java編譯器不生成機(jī)器代碼,但它確生成在虛擬機(jī)上運(yùn)行的字節(jié)代碼,以便Java程序可以在實(shí)現(xiàn)Java解釋器和環(huán)境的系統(tǒng)上運(yùn)行。5,可靠性Java變量類(lèi)型是強(qiáng)類(lèi)型的,因此在編譯擴(kuò)展時(shí),會(huì)檢查類(lèi)型沖突,并且不會(huì)阻止運(yùn)行時(shí)或類(lèi)型沖突。Java程序的可靠性也反映在異常處理中。異常是發(fā)生異常時(shí)發(fā)生的信號(hào)。例如,如果數(shù)組超出范圍且分母為零。使用try/catch/finally運(yùn)算符查找錯(cuò)誤的代碼并處理錯(cuò)誤情況。6,便攜性Java運(yùn)行時(shí)使用ANSIC編寫(xiě),Java編譯器使用Java編寫(xiě)。換句話說(shuō),如果你可以運(yùn)行Java程序,你可以自編譯,Java非常便攜。2.2SOCKET網(wǎng)絡(luò)編程SOCKE英文翻譯叫套接字。在網(wǎng)絡(luò)編程中,其實(shí)際意義可以理解為用于網(wǎng)絡(luò)通信連接的接口,通常稱(chēng)為套接字。當(dāng)將連接到網(wǎng)絡(luò)的終端與電話進(jìn)行比較時(shí),SOCKET對(duì)應(yīng)于電話線插座,并且為每個(gè)終端提供用于與其他終端通信的橋或信道。所有子端必須連接到此“端口”以終止,否則,它獨(dú)立于網(wǎng)絡(luò)。因此我們可以得出結(jié)論,套接字是連接終端的主要目的。SOCKET對(duì)象的功能又是什么?通常,你可以使用WINSOCK庫(kù)來(lái)創(chuàng)建和使用SOCKET,并使用基本的WINSOCK庫(kù)API來(lái)接收簡(jiǎn)單的輸入/輸出(即發(fā)送和接收數(shù)據(jù))。創(chuàng)建SOCKET對(duì)象后,指定IP地址,然后指定要在計(jì)算機(jī)上通信的應(yīng)用程序,指定要通信的SOCKET設(shè)備,并指定設(shè)備的端口號(hào)(通常為1024或更多)定義的連接對(duì)象然后可以使用SOCKET與目標(biāo)計(jì)算機(jī)上的應(yīng)用程序傳輸數(shù)據(jù)或交換信息REF_Ref11027245\r\h錯(cuò)誤!未找到引用源。。在連接網(wǎng)絡(luò)通信中,你使用SOCKET來(lái)監(jiān)視和建立連接,在建立穩(wěn)定連接之前,數(shù)據(jù)傳輸不會(huì)啟動(dòng)。2.3TCP/IP協(xié)議本項(xiàng)目使用TCP/IP協(xié)議在Windows操作系統(tǒng)上使用的客戶(hù)端和服務(wù)器之間進(jìn)行聯(lián)網(wǎng)。但是,并非所有網(wǎng)絡(luò)通信應(yīng)用程序都直接與TCP/IP核心交互,而是與網(wǎng)絡(luò)編程接口的Windows套接字API交互。對(duì)于物理網(wǎng)絡(luò)介質(zhì)(例如網(wǎng)絡(luò)適配器),底層TCP/IP協(xié)議是一種允許網(wǎng)絡(luò)應(yīng)用程序之間通信的功能。TCP/IP是指?jìng)鬏斂刂茀f(xié)議/Internet協(xié)議,也稱(chēng)為網(wǎng)絡(luò)協(xié)議。TCP/IP定義了電子設(shè)備如何連接到網(wǎng)絡(luò)以及如何在它們之間傳輸數(shù)據(jù)。TCP/IP協(xié)議實(shí)際上是一組協(xié)議,包括許多旨在確保計(jì)算機(jī)之間信息交換的協(xié)議。根據(jù)OSI網(wǎng)絡(luò)的標(biāo)準(zhǔn)定義,網(wǎng)絡(luò)包括物理層,鏈路層,網(wǎng)絡(luò)層,傳輸層,會(huì)話層,表示層和應(yīng)用層。在實(shí)際應(yīng)用中,TCP/IP協(xié)議將網(wǎng)絡(luò)功能從下到上分為四層:網(wǎng)絡(luò)接口層,網(wǎng)絡(luò)層,傳輸層和應(yīng)用層。傳輸層是四層中最重要的層,是唯一負(fù)責(zé)一般數(shù)據(jù)傳輸和數(shù)據(jù)控制的層。提供端到端傳輸服務(wù),提供有關(guān)網(wǎng)絡(luò)級(jí)目標(biāo)的可靠信息。傳輸層的兩個(gè)主要協(xié)議是TCP和UDP。TCP是發(fā)送高質(zhì)量數(shù)據(jù)的理想選擇,因?yàn)樗ㄟ^(guò)數(shù)據(jù)流控制,多路復(fù)用和數(shù)據(jù)同步確認(rèn)提供可靠的全雙工網(wǎng)絡(luò)通信服務(wù)。它也是最廣泛使用的網(wǎng)絡(luò)通信協(xié)議之一,有助于確??煽康臄?shù)據(jù)傳輸。2.4TCP/IP工作過(guò)程2.4.1連接建立打電話時(shí),經(jīng)一方撥號(hào)呼叫,在通話雙方的話機(jī)之間建立一條話路。TCP是面向連接的協(xié)議,與電話通信一樣,用TCP編寫(xiě)程序,也必須先建立TCP連接。TCP協(xié)議要通過(guò)三個(gè)報(bào)文段完成類(lèi)似電話呼叫的連接建立過(guò)程,這個(gè)過(guò)程稱(chēng)為三次握手(three-wayhandshake)。大致流程如下:

第一次握手,客戶(hù)端向服務(wù)器發(fā)送一個(gè)SYN,

第二次握手,服務(wù)器向客戶(hù)端響應(yīng)一個(gè)SYN,并對(duì)SYN進(jìn)行確認(rèn)ACK。

第三次握手,客戶(hù)端再向服務(wù)器發(fā)一個(gè)確認(rèn)ACK。到此,三次握手結(jié)束。圖2-1TCP的三次握手Figure2-1TCPthree-wayhandshake2.4.2傳輸數(shù)據(jù)一旦通信雙方建立了TCP連接,連接中任何一方都能向發(fā)送數(shù)據(jù)和接收對(duì)方發(fā)來(lái)的數(shù)據(jù)。利用TCP傳輸數(shù)據(jù)時(shí),數(shù)據(jù)是以字節(jié)流的形式進(jìn)行傳輸?shù)摹?蛻?hù)端與服務(wù)器建立連接后,發(fā)送方需要先將發(fā)送的數(shù)據(jù)轉(zhuǎn)化為字節(jié)流,然后將其發(fā)送給對(duì)方。發(fā)送數(shù)據(jù)時(shí),可以通過(guò)程序不斷的將數(shù)據(jù)流寫(xiě)入TCP的發(fā)送緩存中,然后TCP自動(dòng)從緩存中取出一定的數(shù)據(jù),將其組成TCP報(bào)文逐個(gè)發(fā)送個(gè)IP層,再通過(guò)IP層之下的網(wǎng)絡(luò)接口發(fā)出去。接收端從IP層接收到TCP報(bào)文后,將其暫時(shí)保存到接收緩存中,然后通過(guò)程序依次讀取接收緩存中的數(shù)據(jù)REF_Ref11027284\r\h錯(cuò)誤!未找到引用源。。2.4.2連接終止建立一個(gè)連接需要三次握手,但是終止一個(gè)連接卻需要四次握手,這是由TCP的半關(guān)閉造成的。1.首先調(diào)用close主動(dòng)關(guān)閉連接,這時(shí)TCP發(fā)送一個(gè)FIN;

2.另一端接收到FIN之后,執(zhí)行被動(dòng)關(guān)閉,對(duì)這個(gè)FIN進(jìn)行確認(rèn),發(fā)送FIN

3.一段時(shí)間之后,接收到文件結(jié)束符的應(yīng)用進(jìn)程調(diào)用close關(guān)閉它的socket。這導(dǎo)致它的TCP發(fā)送一個(gè)ACK;

4.接收到這個(gè)ACK的源發(fā)送端TCP對(duì)它進(jìn)行確認(rèn),發(fā)送一個(gè)ACK。圖2-1TCP的四次握手Figure2-1TCPfour-wayhandshake2.5C/S模式介紹客戶(hù)端/服務(wù)器模型稱(chēng)為C/S模型,是一種計(jì)算機(jī)模型,誕生于20世紀(jì)90年代,很快就被采用。該模型實(shí)際上劃分了主機(jī)部分中所有主機(jī)終端模式的任務(wù)。其次,主機(jī)上留下的頁(yè)面負(fù)責(zé)集中處理和匯總,而終端上的頁(yè)面負(fù)責(zé)提供稱(chēng)為客戶(hù)端的方便的交互式界面。與其前身相比,C/S模式的主要改進(jìn)是應(yīng)用系統(tǒng)分為兩個(gè)角色和兩個(gè)不同的位置,并且所有軟件都不存儲(chǔ)在一臺(tái)計(jì)算機(jī)中。服務(wù)器程序安裝在計(jì)算機(jī)上,客戶(hù)端程序安裝在常規(guī)PC上。隨著個(gè)人PC客戶(hù)端/服務(wù)器模式的出現(xiàn),這是可能的。由于PC具有一定的計(jì)算能力,因此在第一模式下交換無(wú)源終端后,可以在客戶(hù)端上交換部分主機(jī)的工作。該單元具有減少主機(jī)負(fù)載并提高用戶(hù)系統(tǒng)響應(yīng)速度和響應(yīng)能力的功能REF_Ref11027415\r\h錯(cuò)誤!未找到引用源。。客戶(hù)端和服務(wù)器通過(guò)適當(dāng)?shù)木W(wǎng)絡(luò)協(xié)議交換數(shù)據(jù)??蛻?hù)端向服務(wù)器發(fā)送數(shù)據(jù)請(qǐng)求,服務(wù)器將數(shù)據(jù)發(fā)送到客戶(hù)端以獲取請(qǐng)求。計(jì)算完成后,您可以將結(jié)果發(fā)送回服務(wù)器。該模型的優(yōu)勢(shì)在于它可以最大限度地提高客戶(hù)的性能并顯著提高計(jì)算能力。此外,客戶(hù)端和服務(wù)器之間的連接是通過(guò)邏輯連接進(jìn)行的,即物理上通過(guò)客戶(hù)端上的網(wǎng)絡(luò)協(xié)議進(jìn)行。服務(wù)器的兩端都很容易開(kāi)發(fā)。C/S模式是目前主流的計(jì)算機(jī)網(wǎng)絡(luò)模型。首先,服務(wù)器需要根據(jù)請(qǐng)求啟動(dòng)和部署相應(yīng)的服務(wù)(過(guò)程如下):(1)打開(kāi)通信通道并通知本地主機(jī)。服務(wù)器已準(zhǔn)備好接受來(lái)自客戶(hù)端的特定感知地址的請(qǐng)求。(2)等待客戶(hù)端請(qǐng)求到達(dá)端口。(3)接收重復(fù)的服務(wù)請(qǐng)求,處理請(qǐng)求,并發(fā)送響應(yīng)信號(hào)。(4)返回第二步,等待客戶(hù)的另一個(gè)請(qǐng)求。(5)關(guān)閉服務(wù)器??蛻?hù):(1)打開(kāi)通信通道并連接到服務(wù)器所在主機(jī)的特定端口。(2)向服務(wù)器發(fā)送服務(wù)請(qǐng)求消息并等待響應(yīng),然后繼續(xù)請(qǐng)求。(3)當(dāng)請(qǐng)求完成時(shí),通信信道關(guān)閉并終止。分布式計(jì)算和分布式控制是客戶(hù)端/服務(wù)器模型的特征。最后,我選擇了C/S模式開(kāi)發(fā)本項(xiàng)目。2.6MySQL數(shù)據(jù)庫(kù)介紹MySQL是一個(gè)小型關(guān)系型數(shù)據(jù)庫(kù)管理系統(tǒng),開(kāi)發(fā)者為瑞典MySQLAB公司。MySQL被廣泛地應(yīng)用在Internet上的中小型網(wǎng)站中。由于其體積小、速度快、總體擁有成本低,尤其是開(kāi)放源碼這一特點(diǎn),許多中小型網(wǎng)站為了降低網(wǎng)站總體擁有成本而選擇了MySQL作為網(wǎng)站數(shù)據(jù)庫(kù)。MySQL數(shù)據(jù)庫(kù)主要有以下特點(diǎn):(1)強(qiáng)大的數(shù)據(jù)保護(hù)功能(2)超強(qiáng)的穩(wěn)定性(3)可移植性(4)支持大型數(shù)據(jù)庫(kù)(5)可擴(kuò)展性和靈活性(6)強(qiáng)大的查詢(xún)功能2.7JavaSoundJavaSound包含在JDK中,版本為1.3.0JDK或更高版本,支持?jǐn)?shù)字和MIDI音頻數(shù)據(jù)的錄制和回放,是一個(gè)小型的基本APIREF_Ref516072056\r\h錯(cuò)誤!未找到引用源。。例如,使用JavaSound進(jìn)行音頻處理的程序可以在Java1.3或更高版本上運(yùn)行。JavaSoundLine界面提供類(lèi)似于聲音效果等聲音效果的對(duì)象。例如,調(diào)整音量,錄制事件監(jiān)聽(tīng)器或關(guān)閉或打開(kāi)設(shè)備。音頻輸入應(yīng)使用TargetDataLine接口,該接口代表輸入設(shè)備。音頻輸入應(yīng)使用SourceDataLine接口,這兩個(gè)接口都代表從線路接口繼承的輸出設(shè)備。AudioSystem類(lèi)充當(dāng)JavaSound系統(tǒng)的工廠類(lèi),并提供一組外部靜態(tài)方法來(lái)為JavaSound系統(tǒng)提供默認(rèn)配置資源。處理音頻輸入時(shí),TargetDataLine接口從音頻輸入連接器(如CD播放器,磁帶播放器,麥克風(fēng)等)獲取信號(hào)的數(shù)字音頻輸入流。處理音頻輸出信號(hào)時(shí),處理后的信號(hào)記錄在SourceDataLine上,然后發(fā)送到輸出終端,如揚(yáng)聲器或耳機(jī)。2.8脈沖編碼調(diào)制脈沖編碼調(diào)制(PCM)是連續(xù)模擬信號(hào)的離散化,量化和編碼。如果樣本服從奈奎斯特采樣定理,則它周期性地對(duì)模擬信號(hào)進(jìn)行采樣并提取當(dāng)前值以獲得離散數(shù)字信號(hào)。采樣的數(shù)字信號(hào)必須能夠在容錯(cuò)范圍內(nèi)恢復(fù)原始模擬信號(hào)而不失真。量化意味著采樣時(shí)間的瞬時(shí)值由一組電平值表示,這些電平值通常以二進(jìn)制格式表示,以便在諸如光纖的信道上傳輸。編碼必須以二進(jìn)制代碼表示所有量化值。也稱(chēng)為A/D轉(zhuǎn)換,稱(chēng)為A/D轉(zhuǎn)換。量化誤差是采樣信號(hào)和量化信號(hào)之間的差,采樣率越高,得到的二進(jìn)制比特越大,量化誤差越小,傳輸速率越高,頻帶越寬REF_Ref516071908\r\h錯(cuò)誤!未找到引用源。。2.9本章小結(jié)本章主要介紹開(kāi)發(fā)基于Java的語(yǔ)音通信軟件所需的相關(guān)技術(shù)。首先,我們將闡明Java語(yǔ)言的歷史和特性,然后詳細(xì)描述三向和四向TCP協(xié)商協(xié)議,然后介紹C/S模型和JavaSoundAPI和脈沖編碼調(diào)制PCM作為語(yǔ)音編碼描述。還介紹了Socket網(wǎng)絡(luò)編程技術(shù),用到了mysql數(shù)據(jù)庫(kù)。本章解釋了下一章的理論基礎(chǔ)。3軟件的需求分析本章主要從局域網(wǎng)即時(shí)通信軟件的總體需求、運(yùn)行需求、性能需求、數(shù)據(jù)需求以及功能需求等四個(gè)方面對(duì)即時(shí)通訊軟件進(jìn)行詳細(xì)的需求分析,從而明確本文的設(shè)計(jì)目標(biāo),有利于軟件的順利完成。3.1需求分析在本文中開(kāi)發(fā)的即時(shí)消息傳遞軟件基于局域網(wǎng)(LAN),該局域網(wǎng)可被視為因特網(wǎng)上的小型即時(shí)消息傳遞軟件。但是,在本地網(wǎng)絡(luò)上,互聯(lián)網(wǎng)是一個(gè)非常大的網(wǎng)絡(luò),結(jié)構(gòu)非常復(fù)雜,情況比局域網(wǎng)復(fù)雜,而且網(wǎng)絡(luò)范圍縮小,所以即時(shí)通訊軟件的設(shè)計(jì)比在互聯(lián)網(wǎng)上設(shè)計(jì)就容易了。用戶(hù)體積小,設(shè)備簡(jiǎn)單,連接速度快。與互聯(lián)網(wǎng)上的即時(shí)消息軟件相比,這有利于在本地網(wǎng)絡(luò)上開(kāi)發(fā)即時(shí)語(yǔ)音通信軟件。由于本地網(wǎng)絡(luò)上的即時(shí)通信軟件通常使用服務(wù)器提供對(duì)服務(wù)器端連接的響應(yīng),因此用戶(hù)通過(guò)客戶(hù)端上的特殊應(yīng)用程序連接到服務(wù)器,最終進(jìn)行聊天或服務(wù)器立即發(fā)送登錄的用戶(hù)同一臺(tái)服務(wù)器。另外,用戶(hù)之間的通信必須首先在客戶(hù)端和服務(wù)器之間建立連接,以便服務(wù)器能夠及時(shí)接收,處理和發(fā)送客戶(hù)端發(fā)送的信息。因此,即時(shí)消息軟件必須在本地網(wǎng)絡(luò)環(huán)境中實(shí)現(xiàn)服務(wù)器和客戶(hù)端程序。3.2業(yè)務(wù)需求分析1.用戶(hù)界面。本地網(wǎng)絡(luò)的即時(shí)通時(shí)通信軟件體積小,下載速度快,無(wú)下載界面。啟動(dòng)后應(yīng)用程序的界面簡(jiǎn)單明了,用戶(hù)可以立即啟動(dòng)。2.如果出現(xiàn)故障排除錯(cuò)誤或預(yù)期情況,本地網(wǎng)絡(luò)上的即時(shí)消息軟件將提示用戶(hù)在發(fā)生意外錯(cuò)誤時(shí)自動(dòng)安全地關(guān)閉。3.在本地網(wǎng)絡(luò)上設(shè)置使用即時(shí)消息軟件的環(huán)境的要求不應(yīng)太高,它可以在普通計(jì)算機(jī)上運(yùn)行。3.3性能要求分析1.高穩(wěn)定性,可在因系統(tǒng)問(wèn)題等發(fā)生錯(cuò)誤后執(zhí)行適當(dāng)?shù)奶??理。你可以在發(fā)生未知錯(cuò)誤后盡可能保證即時(shí)消息程序的安全。在開(kāi)發(fā)即時(shí)消息軟件時(shí),有必要在用戶(hù)使用期間記錄盡可能多的事件,并在評(píng)估事件后,采取適當(dāng)?shù)拇胧┮源_保程序具有高度的容錯(cuò)能力。2.即時(shí)語(yǔ)音通信軟件應(yīng)簡(jiǎn)單易懂,易于使用。即時(shí)語(yǔ)音通信軟件的界面相對(duì)簡(jiǎn)單,模仿現(xiàn)有即時(shí)通訊軟件的界面,方便用戶(hù)理解和使用。通過(guò)模塊化功能設(shè)計(jì),即時(shí)語(yǔ)音通信軟件的不同模塊實(shí)現(xiàn)不同的功能,從而便于將來(lái)的維護(hù)和增強(qiáng),可以進(jìn)一步增強(qiáng)該即時(shí)語(yǔ)音通信軟件的語(yǔ)音功能。3.4數(shù)據(jù)需求分析1,必須在顯示界面上顯示客戶(hù)端之間的通信信息,以便用戶(hù)可以清楚地看到他已發(fā)送和接收的信息。2.客戶(hù)端顯示在線用戶(hù)列表信息,顯示用戶(hù)ID和用戶(hù)名很有必要。3.你需要在本地網(wǎng)絡(luò)上提供有關(guān)用戶(hù)信息的特定信息。服務(wù)器需要包含有關(guān)用戶(hù)的所有信息的文本文檔。主要內(nèi)容包括用戶(hù)ID,帳號(hào)和密碼。3.5功能要求分析1.用戶(hù)注冊(cè):用戶(hù)輸入有關(guān)客戶(hù)的帳戶(hù),密碼,名稱(chēng)和其他信息??蛻?hù)端壓縮用戶(hù)的注冊(cè)信息并將其發(fā)送到服務(wù)器。服務(wù)器確定用戶(hù)的注冊(cè)信息是否滿足注冊(cè)要求,在完成時(shí)記錄該信息,并向客戶(hù)端返回有關(guān)成功注冊(cè)的信息,否則返回錯(cuò)誤信息。滿足注冊(cè)要求你需將注冊(cè)信息發(fā)送給客戶(hù)。2.用戶(hù)登錄:用戶(hù)在客戶(hù)端登錄界面輸入自己的帳號(hào)和密碼。單擊登錄后,客戶(hù)端將用戶(hù)的填寫(xiě)信息發(fā)送到服務(wù)器以進(jìn)行驗(yàn)證。如果服務(wù)器在包含用戶(hù)信息的文本文件中找到連接信息帳戶(hù)信息和密碼,則該連接可以連接到客戶(hù)端并進(jìn)行連接。如果未指定相應(yīng)的帳戶(hù)和密碼,將發(fā)送連接錯(cuò)誤消息。對(duì)于客戶(hù)端,客戶(hù)端在收到消息后,會(huì)為用戶(hù)帳戶(hù)請(qǐng)求錯(cuò)誤的密碼。3.在線搜索用戶(hù):一旦用戶(hù)登錄到客戶(hù)端,服務(wù)器就會(huì)立即將網(wǎng)絡(luò)上其他用戶(hù)的信息發(fā)送給連接的客戶(hù)端。用戶(hù)可以在主聊天頁(yè)面上查看其他在線用戶(hù)標(biāo)識(shí)符和名稱(chēng)。4.即時(shí)聊天用戶(hù)可以選擇任何在線用戶(hù)通過(guò)即時(shí)通信軟件的主界面發(fā)送消息,服務(wù)器可以在收到消息后將消息轉(zhuǎn)發(fā)給指定用戶(hù)。5.文件傳輸:當(dāng)與網(wǎng)絡(luò)上的其他用戶(hù)通信時(shí),該用戶(hù)可以將文件發(fā)送到聊天對(duì)象。如果收件人不接受該文件,則服務(wù)器拒絕接收的提示并將其發(fā)送給發(fā)件人的客戶(hù)端。3.6小結(jié)在本章中,我們將主要分析局域網(wǎng)上即時(shí)消息軟件的不同要求,并根據(jù)您的設(shè)計(jì)目標(biāo)設(shè)置項(xiàng)目方向。這種設(shè)計(jì)使用戶(hù)能夠進(jìn)行注冊(cè),登錄,即時(shí)聊天,文件傳輸?shù)裙δ?,以及軟件的操作要求,性能要求和用?hù)數(shù)據(jù),使得即時(shí)通訊軟件的準(zhǔn)確,快速開(kāi)發(fā)必須得到滿足。在進(jìn)行此需求分析之后,可以正確組織設(shè)計(jì)過(guò)程以確保項(xiàng)目的正確完成。4基于Java的語(yǔ)音通信軟件實(shí)現(xiàn)4.1服務(wù)器程序?qū)崿F(xiàn)服務(wù)器主要包括DAO層、連接管理器、監(jiān)聽(tīng)器、數(shù)據(jù)發(fā)送器等部分。DAO層部分負(fù)責(zé)數(shù)據(jù)的增加、刪除、修改、查找,監(jiān)聽(tīng)器負(fù)責(zé)處理客戶(hù)端的各種請(qǐng)求,連接管理器對(duì)所有客戶(hù)端連接進(jìn)行管理,數(shù)據(jù)發(fā)送器負(fù)責(zé)向客戶(hù)端發(fā)送數(shù)據(jù)。4.1.1創(chuàng)建數(shù)據(jù)庫(kù)首先使用數(shù)據(jù)庫(kù)語(yǔ)句“createdatabaseim_qq”創(chuàng)建名稱(chēng)為im_qq的數(shù)據(jù)庫(kù);接下來(lái)創(chuàng)建數(shù)據(jù)庫(kù)用戶(hù)表、關(guān)系表。數(shù)據(jù)庫(kù)語(yǔ)句如下:1、創(chuàng)建im_user表圖4-1創(chuàng)建用戶(hù)表Figure4-1Creatingausertable運(yùn)行上面的SQL語(yǔ)句,得到表4-1表4-1用戶(hù)信息表Tab.3-1Theinformationofusers列名數(shù)據(jù)類(lèi)型空/非空備注idbigint非空自動(dòng)遞增usernamevarchar(20)非空用戶(hù)名,索引passwordvarchar(50)非空密碼nicknamevarchar(30)昵稱(chēng)emailvarchar(50)非空郵箱phonevarchar(20)手機(jī)avatarvarchar(250)頭像provincevarchar(20)省份townvarchar(30)城市addressvarchar(100)詳細(xì)地址is_activedint(5)非空1激活;2未激活gmt_modifiedtimestamp非空更新時(shí)間gmt_createtimestamp非空創(chuàng)建時(shí)間2、創(chuàng)建im_relationship表圖4-1創(chuàng)建關(guān)系表Figure4-1Creatingarelationshiptable運(yùn)行上面的SQL語(yǔ)句,得到表4-2表4-2好友關(guān)系表Tab.3-2Therelationshipofusers列名數(shù)據(jù)類(lèi)型空/非空備注idbigint非空自動(dòng)遞增user_a_idbigint非空a用戶(hù)id,索引user_b_idbigint非空b用戶(hù)id,索引requestint(10)非空1:a請(qǐng)求添加b為好友;2:b請(qǐng)求添加a為好友request_timetimestamp非空發(fā)起請(qǐng)求的時(shí)間resultint(10)非空1:已接受;2:等待中;3:已拒絕result_timetimestamp非空回應(yīng)時(shí)間relationshipint(20)非空1:陌生人;2:普通好友permission_bint(30)非空城市permission_aint(30)非空詳細(xì)地址gmt_modifiedtimestamp非空更新時(shí)間gmt_createtimestamp非空創(chuàng)建時(shí)間4.1.2數(shù)據(jù)庫(kù)連接Java數(shù)據(jù)庫(kù)連接(JDBC)是一種用Java編寫(xiě)的數(shù)據(jù)庫(kù)連接API,Java程序可以直接調(diào)用這些方法來(lái)執(zhí)行SQL命令,添加,刪除,修改數(shù)據(jù)庫(kù)以及支持?jǐn)?shù)據(jù)庫(kù)事務(wù)操作。JDBC主要用于連接數(shù)據(jù)庫(kù),對(duì)數(shù)據(jù)庫(kù)執(zhí)行相應(yīng)的操作,以及對(duì)這些表進(jìn)行操作,即執(zhí)行數(shù)據(jù)庫(kù)語(yǔ)句。使用JDBC降低了開(kāi)發(fā)數(shù)據(jù)庫(kù)應(yīng)用程序的復(fù)雜性。開(kāi)發(fā)人員只需要知道如何在不了解內(nèi)部實(shí)現(xiàn)的情況下使用數(shù)據(jù)庫(kù),加快開(kāi)發(fā)速度并管理多個(gè)數(shù)據(jù)庫(kù)REF_Ref516172098\r\h錯(cuò)誤!未找到引用源。。除了常規(guī)SQL語(yǔ)句之外,還可以使用IN和OUT參數(shù)執(zhí)行動(dòng)態(tài)SQL語(yǔ)句和存儲(chǔ)過(guò)程,并支持預(yù)編譯。要想使用JDBC,首先要?jiǎng)?chuàng)建JDBCJDBCUtils工具類(lèi)。此類(lèi)首先讀取配置文件中的數(shù)據(jù)庫(kù)帳戶(hù)密碼和其他信息,然后加載數(shù)據(jù)庫(kù)驅(qū)動(dòng)程序并從該驅(qū)動(dòng)程序連接到數(shù)據(jù)庫(kù)。同時(shí),創(chuàng)建數(shù)據(jù)庫(kù)連接池并將其封裝在JDBCDataSource類(lèi)中,以避免常見(jiàn)操作(如驅(qū)動(dòng)程序加載)。此類(lèi)繼承自DataSource類(lèi),該類(lèi)使用LinkedList全局集合加載數(shù)據(jù)庫(kù)連接,并使用JDBCUtils實(shí)用程序類(lèi)在初始化期間獲取適當(dāng)數(shù)量的數(shù)據(jù)庫(kù)連接。然后使用單例模型連接到數(shù)據(jù)庫(kù)。使用外部連接時(shí),它將繼續(xù)進(jìn)入連接池,從而減少過(guò)多的連接創(chuàng)建。4.1.3DAO層的實(shí)現(xiàn)數(shù)據(jù)添加,刪除和更改封裝在DAO級(jí)別。對(duì)于外部調(diào)用,您必須傳遞相應(yīng)的要素類(lèi)。下面是一個(gè)示例:例如,如果只發(fā)送用戶(hù)名和密碼,則需要登錄并使用您的手機(jī)號(hào)碼執(zhí)行其他操作。第一次傳遞用戶(hù)類(lèi)時(shí),只需將手機(jī)插入用戶(hù)類(lèi)而不添加任何變量。因此,DAO層交互級(jí)別是與對(duì)象的交互。要實(shí)現(xiàn)DAO層,您需要?jiǎng)?chuàng)建實(shí)體類(lèi),即用戶(hù)類(lèi)和關(guān)系類(lèi)。在添加,刪除和編輯時(shí)始終使用預(yù)編譯以避免SQL注入REF_Ref516172098\r\h錯(cuò)誤!未找到引用源。。1,插入數(shù)據(jù)首先創(chuàng)建適當(dāng)?shù)腄AO類(lèi)。例如:例如,在UserDao類(lèi)中,為該類(lèi)創(chuàng)建一個(gè)insert方法。此方法定義兩個(gè)臨時(shí)變量Connectionconn和PreparedStatementstmt,并獲取從連接池到conn數(shù)據(jù)庫(kù)到數(shù)據(jù)庫(kù)的連接。然后編寫(xiě)相應(yīng)的SQL語(yǔ)句并使用Connection類(lèi)的prepareStatement方法將SQL語(yǔ)句發(fā)送到數(shù)據(jù)庫(kù)進(jìn)行編譯。然后設(shè)置參數(shù)。設(shè)置參數(shù)后,使用preparedStatement類(lèi)的executeUpdate方法執(zhí)行SQL語(yǔ)句。插入完成。因?yàn)槲覀冃枰@取新插入的標(biāo)識(shí)符的值,所以我們需要執(zhí)行SELECTLAST_INSERT_ID()語(yǔ)句以獲取將放置在用戶(hù)實(shí)例中并返回給調(diào)用者的相應(yīng)標(biāo)識(shí)符值,數(shù)據(jù)庫(kù)將自動(dòng)連接已恢復(fù)到連接池。2,刪除數(shù)據(jù)首先在相應(yīng)的DAO類(lèi)中創(chuàng)建一個(gè)刪除方法。例如,UserDao類(lèi)。此方法定義兩個(gè)臨時(shí)變量Connectionconn和PreparedStatementstmt,并獲取從連接池到conn數(shù)據(jù)庫(kù)到數(shù)據(jù)庫(kù)的連接。然后編寫(xiě)相應(yīng)的SQL語(yǔ)句并使用Connection類(lèi)的prepareStatement方法將SQL語(yǔ)句發(fā)送到數(shù)據(jù)庫(kù)進(jìn)行編譯。然后設(shè)置參數(shù),使用PreparedStatement類(lèi)的ExecuteStatement方法設(shè)置它們,并執(zhí)行SQL運(yùn)算符。此時(shí),刪除已完成,并返回刪除結(jié)果。在返回之前,應(yīng)該在finally塊中釋放數(shù)據(jù)庫(kù)連接,即可將數(shù)據(jù)庫(kù)連接恢復(fù)到連接池。3.修改數(shù)據(jù)首先在相應(yīng)的DAO類(lèi)中創(chuàng)建更新方法,如下所示:例如,在UserDao類(lèi)中,在PreparedStatementstmt方法中設(shè)置臨時(shí)變量Connectionconn以獲取連接池?cái)?shù)據(jù)庫(kù)的連接分配。接下來(lái),創(chuàng)建適當(dāng)?shù)腟QL語(yǔ)句,使用Connection語(yǔ)句的prepareStatement方法將SQL語(yǔ)句發(fā)送到數(shù)據(jù)庫(kù),將其編譯到數(shù)據(jù)庫(kù)中,設(shè)置參數(shù),并在PreparedStatement方法的prepareUpdate()方法中使用它們Set這是一個(gè)用于執(zhí)行的類(lèi)SQL語(yǔ)句。返回更改結(jié)果。在返回之前,應(yīng)該在finally塊中釋放數(shù)據(jù)庫(kù)連接,即可將數(shù)據(jù)庫(kù)連接將恢復(fù)到連接池。4,查詢(xún)數(shù)據(jù)查詢(xún)數(shù)據(jù)有點(diǎn)復(fù)雜。以UserDao類(lèi)為例。從創(chuàng)建select方法開(kāi)始,指定由四個(gè)用戶(hù)變量exitResult,連接數(shù)據(jù)庫(kù)連接連接,預(yù)編譯處理類(lèi)stpatPreparedStatement和ResultSet的結(jié)果返回的結(jié)果。與添加,刪除和修改一樣,在建立數(shù)據(jù)庫(kù)連接時(shí),將編寫(xiě)SQL運(yùn)算符,編譯和配置參數(shù)以執(zhí)行executeQuery方法,并將結(jié)果分配給結(jié)果。然后根據(jù)數(shù)據(jù)庫(kù)表列名讀取相應(yīng)的值并封裝在用戶(hù)實(shí)例中,結(jié)果返回,實(shí)例傳遞給調(diào)用者。除此之外,此步驟還與其他搜索方法和其他類(lèi)別的搜索方法一起顯示,以防止重復(fù)過(guò)多的任務(wù)。例如,將結(jié)果集封裝到用戶(hù)類(lèi)中。因此,需要?jiǎng)?chuàng)建一個(gè)共同的類(lèi)。所以我先從創(chuàng)建MyResultHandler接口開(kāi)始,此接口具有以下hande方法:公共接口MyResultHandler<T>{打開(kāi)T句柄(ResultSetrs)。}接下來(lái),創(chuàng)建MyBeanHandler類(lèi)以實(shí)現(xiàn)接口,從JavaBean對(duì)象類(lèi)獲取JavaBean實(shí)例,從JavaBean實(shí)例獲取BeanInfo對(duì)象,并從Beaninfo對(duì)象中提取屬性描述符。接下來(lái),找到屬性描述符的屬性名稱(chēng)和結(jié)果集的列名稱(chēng)。這些匹配存儲(chǔ)在Javabean中,最后返回javabean。對(duì)數(shù)據(jù)庫(kù)中其他表的添加,刪除和修改與上述類(lèi)似。從這時(shí)起,DAO層基本上已經(jīng)實(shí)現(xiàn)。4.1.4業(yè)務(wù)層實(shí)現(xiàn)1、注冊(cè)業(yè)務(wù)當(dāng)服務(wù)器收到注冊(cè)數(shù)據(jù)時(shí),它將被發(fā)送到注冊(cè)表偵聽(tīng)器進(jìn)行處理。注冊(cè)接收者首先檢查數(shù)據(jù)是否與通信幀的格式匹配,否則將不會(huì)被處理,解析用戶(hù)對(duì)象中的一些數(shù)據(jù),然后搜索數(shù)據(jù)庫(kù)用戶(hù)。系統(tǒng)將要求您提供數(shù)據(jù)以確認(rèn)郵箱已注冊(cè)。如果已經(jīng)注冊(cè),注冊(cè)信息將直接從郵箱返回給用戶(hù)。否則,驗(yàn)證碼將被發(fā)送到郵箱。最后,將當(dāng)前登錄的用戶(hù)設(shè)置為用戶(hù)對(duì)象,并通知客戶(hù)端已發(fā)送驗(yàn)證碼。開(kāi)始開(kāi)始接收客戶(hù)端上傳的byte數(shù)組提交給監(jiān)聽(tīng)器數(shù)據(jù)校驗(yàn)是否通過(guò)將byte數(shù)組中的數(shù)據(jù)部分解析成User對(duì)象是否已注冊(cè)發(fā)送郵件,將驗(yàn)證碼和User對(duì)象保存到數(shù)據(jù)庫(kù)向客戶(hù)端發(fā)送注冊(cè)請(qǐng)求處理完畢消息結(jié)束否是是否向客戶(hù)端發(fā)送已注冊(cè)消息圖4-3注冊(cè)流程圖Fig.4-3Registerflowchart

當(dāng)用戶(hù)將從郵箱接收的驗(yàn)證碼發(fā)送到服務(wù)器時(shí),服務(wù)器首先驗(yàn)證數(shù)據(jù),分析驗(yàn)證代碼中的數(shù)據(jù)。接下來(lái),比較驗(yàn)證碼是否與數(shù)據(jù)庫(kù)中的驗(yàn)證碼匹配。如果不是,則從驗(yàn)證碼返回錯(cuò)誤代碼,否則更新?tīng)顟B(tài)代碼。激活數(shù)據(jù)庫(kù)中的用戶(hù)以表示激活成功。目前,所有注冊(cè)業(yè)務(wù)都已完成。開(kāi)始開(kāi)始接收客戶(hù)端上傳的byte數(shù)組提交給監(jiān)聽(tīng)器數(shù)據(jù)校驗(yàn)是否通過(guò)將byte數(shù)組中的數(shù)據(jù)部分解析成驗(yàn)證碼驗(yàn)證碼是否一致向客戶(hù)端發(fā)送驗(yàn)證成功消息結(jié)束否是是否向客戶(hù)端發(fā)送驗(yàn)證碼錯(cuò)誤圖4-4注冊(cè)驗(yàn)證流程圖Fig.4-4Registerverificationflowchart

2、登錄業(yè)務(wù)當(dāng)服務(wù)器接收連接數(shù)據(jù)時(shí),它將被發(fā)送到連接偵聽(tīng)器進(jìn)行處理。連接偵聽(tīng)器首先檢查數(shù)據(jù)是否與通信幀的格式匹配。如果格式不匹配它將不會(huì)被處理。如果是,則分析用戶(hù)對(duì)象中的一些數(shù)據(jù),根據(jù)對(duì)象中包含的用戶(hù)名和密碼將數(shù)據(jù)庫(kù)分配給用戶(hù)。如果是錯(cuò)誤信息將直接返回給客戶(hù)端,否則,登錄用戶(hù)是用戶(hù)對(duì)象。然后根據(jù)用戶(hù)的目的接收好友列表和消息條目并發(fā)送給客戶(hù)端,最后將連接成功消息發(fā)送給客戶(hù)端。開(kāi)始開(kāi)始接收客戶(hù)端上傳的byte數(shù)組提交給監(jiān)聽(tīng)器數(shù)據(jù)校驗(yàn)是否通過(guò)將byte數(shù)組中的數(shù)據(jù)部分解析成User用戶(hù)名和密碼是否正確向客戶(hù)端發(fā)送好友列表、消息列表和登錄成功消息結(jié)束否是是否向客戶(hù)端發(fā)送用戶(hù)名或密碼錯(cuò)誤消息根據(jù)User對(duì)象獲取好友列表和消息列表圖4-5登錄流程圖Fig.4-5Loginflowchart

3,添加朋友當(dāng)服務(wù)器從添加的朋友接收數(shù)據(jù)時(shí),它會(huì)將其分發(fā)給偵聽(tīng)器并添加朋友。監(jiān)聽(tīng)器首先檢查數(shù)據(jù)是否與通信幀的格式匹配。如果格式不匹配它將不會(huì)被處理。如果是,則分析用戶(hù)對(duì)象中的一些數(shù)據(jù)。然后轉(zhuǎn)到數(shù)據(jù)庫(kù),根據(jù)對(duì)象中的用戶(hù)名找到合適的用戶(hù)。如果用戶(hù)不存在,則直接返回丟失的消息。否則,它將重復(fù)請(qǐng)求。在重復(fù)請(qǐng)求的情況下,直接從客戶(hù)端返回消息“已發(fā)送好友請(qǐng)求”。否則,請(qǐng)求將插入到數(shù)據(jù)庫(kù)中。接下來(lái),檢查請(qǐng)求的用戶(hù)是否在線。在在線模式下,消息將發(fā)送給目標(biāo)用戶(hù)。最后,從客戶(hù)端返回消息“發(fā)送朋友請(qǐng)求”。

開(kāi)始開(kāi)始接收客戶(hù)端上傳的byte數(shù)組提交給監(jiān)聽(tīng)器數(shù)據(jù)校驗(yàn)是否通過(guò)將byte數(shù)組中的數(shù)據(jù)部分解析成User是否注冊(cè)向客戶(hù)端發(fā)送請(qǐng)求已發(fā)送消息結(jié)束否是否向客戶(hù)端發(fā)送該賬號(hào)不存在消息將該請(qǐng)求轉(zhuǎn)發(fā)給被請(qǐng)求用戶(hù)是否重復(fù)請(qǐng)求是否在線是是是否否圖4-6添加好友流程圖Fig.4-6Addfriendsflowchart

4、文字聊天業(yè)務(wù)首先定義一個(gè)消息實(shí)體類(lèi)IMMessage,類(lèi)中定義變量如下: publicStringtype;//數(shù)據(jù)的類(lèi)型,如text publiclongfromUser=0L;//發(fā)送者賬號(hào) publicStringfromNick="";//發(fā)送者昵稱(chēng) publicStringfromAvatar="1";//發(fā)送者頭像 publiclongtoUser=0L;//接收者賬號(hào) publicStringcontent="";//消息的內(nèi)容 publiclongcreateTime;//發(fā)送時(shí)間服務(wù)器接收到文字聊天數(shù)據(jù)后,分發(fā)給文字聊天監(jiān)聽(tīng)器。監(jiān)聽(tīng)器先校驗(yàn)數(shù)據(jù)是否符合通信幀格式,如果不符合則不進(jìn)行處理,符合則將數(shù)據(jù)部分解析成IMMessage對(duì)象。然后根據(jù)對(duì)象中的toUser判斷對(duì)方是否在線,如果不在線,將消息存入數(shù)據(jù)庫(kù),如果在線,則直接轉(zhuǎn)發(fā)給對(duì)方。開(kāi)始開(kāi)始接收客戶(hù)端上傳的byte數(shù)組提交給監(jiān)聽(tīng)器數(shù)據(jù)校驗(yàn)是否通過(guò)將byte數(shù)組中的數(shù)據(jù)部分解析成IMMessage對(duì)方是否在線結(jié)束否是是否轉(zhuǎn)發(fā)給對(duì)方存入數(shù)據(jù)庫(kù)圖4-7文字聊天流程圖Fig.4-7Chatflowchart5、語(yǔ)音通信業(yè)務(wù)定義一個(gè)請(qǐng)求類(lèi)Request,類(lèi)中定義變量如下:publicinttype;//請(qǐng)求類(lèi)型publiclongfromUser=0L;//請(qǐng)求者賬號(hào)publicStringfromNick="";//請(qǐng)求者昵稱(chēng)publicStringfromAvatar="1";//請(qǐng)求者頭像publiclongtoUser=0L;//接收者賬號(hào)publicStringcontent="";//消息的內(nèi)容publiclongcreateTime;//發(fā)送時(shí)間1)請(qǐng)求語(yǔ)音聊天服務(wù)器接收到用戶(hù)甲發(fā)送的請(qǐng)求語(yǔ)音數(shù)據(jù)后,將語(yǔ)音請(qǐng)求下發(fā)給請(qǐng)求的接收者。監(jiān)聽(tīng)器首先檢查數(shù)據(jù)是否與通信幀的格式匹配,如果格式不匹配它將不處理它。然后,分析請(qǐng)求對(duì)象中的一些數(shù)據(jù)并評(píng)估它是否是數(shù)據(jù)。根據(jù)對(duì)象類(lèi)型調(diào)用請(qǐng)求,如果是呼叫請(qǐng)求,先確定對(duì)方是否在網(wǎng)絡(luò)上,如果對(duì)方處于離線狀態(tài),提示客戶(hù)對(duì)方不在線。最后,確定另一方是否正在通信,進(jìn)行呼叫時(shí),將通知客戶(hù)端呼叫者正在呼叫。否則,請(qǐng)求將直接發(fā)送給調(diào)用者。2)開(kāi)始語(yǔ)音聊天在接收到用戶(hù)乙發(fā)送的語(yǔ)音批準(zhǔn)數(shù)據(jù)后,服務(wù)器將請(qǐng)求分發(fā)給請(qǐng)求監(jiān)聽(tīng)器。監(jiān)聽(tīng)器首先檢查數(shù)據(jù)是否與通信幀的格式匹配,如果格式不匹配它將不會(huì)被處理。如果匹配,則分析請(qǐng)求對(duì)象中的一些數(shù)據(jù),并且使用請(qǐng)求對(duì)象中的類(lèi)型來(lái)確定用戶(hù)乙是否同意調(diào)用用戶(hù)的請(qǐng)求。如果不能接受呼叫請(qǐng)求,則立即通知用戶(hù)甲他的伙伴不接受呼叫請(qǐng)求。否則,將為調(diào)用對(duì)象分配IMConnection的兩個(gè)部分的值,收到消息開(kāi)始語(yǔ)音通信。3)停止語(yǔ)音聊天在接收到用戶(hù)乙或用戶(hù)甲發(fā)送的最后一個(gè)語(yǔ)音數(shù)據(jù)后,服務(wù)器將其發(fā)送給請(qǐng)求編輯監(jiān)聽(tīng)器。監(jiān)聽(tīng)器首先檢查數(shù)據(jù)是否與通信幀的格式匹配,如果格式不匹配它將不會(huì)被處理。否則,分析請(qǐng)求對(duì)象中的一些數(shù)據(jù),然后基于請(qǐng)求對(duì)象中的類(lèi)型確定語(yǔ)音請(qǐng)求是否已經(jīng)完成。當(dāng)語(yǔ)音請(qǐng)求完成時(shí),IMConnection對(duì)象的兩個(gè)部分中的每一個(gè)中的通信對(duì)象被分配空值,然后向雙方發(fā)送終止請(qǐng)求消息,并且向雙方發(fā)送語(yǔ)音呼叫。開(kāi)始開(kāi)始語(yǔ)音請(qǐng)求是否在線將請(qǐng)求轉(zhuǎn)發(fā)給對(duì)方是否同意請(qǐng)求將雙方連接的通信對(duì)象變量賦值,通知雙方客戶(hù)端開(kāi)始通信結(jié)束結(jié)束語(yǔ)音通話請(qǐng)求設(shè)置雙方通信對(duì)象變量為空,通知另一個(gè)客戶(hù)端結(jié)束通話對(duì)方不在線對(duì)方不同意語(yǔ)音否是否是圖4-8語(yǔ)音聊天流程圖Fig.4-8Voicechatflowchart4.1.5服務(wù)器端核心類(lèi)介紹1、服務(wù)器入口IMServer類(lèi)在IMServer類(lèi)的main方法中開(kāi)啟線程等待客戶(hù)端接入,如果有客戶(hù)端接入,則將客戶(hù)端連接封裝成IMConnection對(duì)象,并向該對(duì)象添加注冊(cè)、登錄、注冊(cè)驗(yàn)證監(jiān)聽(tīng)器。2、IMConnection類(lèi)IMConnection類(lèi)繼承自Thread類(lèi),是將客戶(hù)端socket連接封裝成帶有用戶(hù)信息的類(lèi)。它還把socket的輸入輸出流封裝成DataOutputStream和DataInputStream,并定義了一個(gè)ArrayList用于放置OnRecevieListener監(jiān)聽(tīng)器。當(dāng)有客戶(hù)端連接時(shí),開(kāi)啟線程將從客戶(hù)端讀取到的數(shù)據(jù)循環(huán)分發(fā)給ArrayList中的監(jiān)聽(tīng)器。客戶(hù)端登錄成功后追加其他監(jiān)聽(tīng)器,以此限制登錄前和登錄后的權(quán)限REF_Ref516172875\r\h錯(cuò)誤!未找到引用源。。3、IMConnManager類(lèi)IMConnManager類(lèi)是用于管理所有客戶(hù)端的IMConnection連接的類(lèi)。類(lèi)中定義了一個(gè)HashMap用于存儲(chǔ)每個(gè)登錄成功的IMConnection連接。4、消息發(fā)送類(lèi)MessageSender<T>1)數(shù)據(jù)校驗(yàn)方法,用于校驗(yàn)客戶(hù)端上傳數(shù)據(jù)的格式是否正確,是否是非法數(shù)據(jù)。protectedbooleancheckByte(byte[]b){ intlength=b.length;//獲取數(shù)組長(zhǎng)度,數(shù)據(jù)長(zhǎng)度不足5則校驗(yàn)失敗 if(length<5) returnfalse; bytecheck=b[4];//獲取校驗(yàn)值 bytexor=(byte)(b[0]^b[1]^b[2]^b[3]);//計(jì)算校驗(yàn)值 if(xor!=check)//校驗(yàn)值是否匹配 returnfalse; returntrue; }2)向其他用戶(hù)發(fā)送數(shù)據(jù),比如發(fā)送添加好友請(qǐng)求、語(yǔ)音通話請(qǐng)求等。publicvoidtoClient(byte[]b,IMConnectionconn)throwsIOException{ if(conn!=null){ conn.writer.write(b); } }3)向其他用戶(hù)群發(fā)消息,用于發(fā)送好友上線提醒、群聊消息等。publicvoidtoEveryClient(List<User>users,byte[]b)throwsIOException{ HashMap<Long,IMConnection>conns=IMConnManager.conns; for(Useru:users){ if(u!=null){ longid=u.getId().longValue(); if(conns.containsKey(id)){ conns.get(id).writer.write(b); } } } }4)將數(shù)據(jù)封裝成數(shù)據(jù)幀格式。publicbyte[]toProtocal(bytetype,Stringjson){ byte[]result; byte[]data=json.getBytes(); intlength=data.length; bytehigh=(byte)(length/100); bytelow=(byte)(length%100); result=newbyte[length+5]; result[0]=55;//數(shù)據(jù)頭 result[1]=high;//數(shù)據(jù)長(zhǎng)度高位 result[2]=low;//數(shù)據(jù)長(zhǎng)度低位 result[3]=type;//數(shù)據(jù)類(lèi)型 result[4]=(byte)(55^high^low^type);//校驗(yàn)值 for(inti=5;i<data.length+5;i++){ result[i]=data[i-5];//數(shù)據(jù)組合 } returnresult; }5)從幀格式數(shù)據(jù)中獲取對(duì)象。publicTgetByByte(byte[]data,Class<T>c){ Stringjson=newString(data,5,data[1]*100+data[2]); Gsong=newGson(); returng.fromJson(json,c); }4.2客戶(hù)端程序?qū)崿F(xiàn)4.2.1界面設(shè)計(jì)界面就是指軟件中面向操作者而專(zhuān)門(mén)設(shè)計(jì)的用于操作使用及反饋信息的指令部分。優(yōu)秀的軟件界面有簡(jiǎn)便易用、突出重點(diǎn)、容錯(cuò)高等特點(diǎn)。1、登錄界面定義一個(gè)繼承自JPanel類(lèi)的LoginPanel類(lèi)用來(lái)顯示登錄界面。界面中用三個(gè)標(biāo)簽分別顯示“用戶(hù)登錄”、“新用戶(hù)”、“忘記密碼”,用兩個(gè)輸入框分別接收用戶(hù)輸入的賬號(hào)和密碼,用兩個(gè)多選框顯示“記住密碼”和“自動(dòng)登錄”,還放置了一個(gè)最小化按鈕、一個(gè)退出按鈕和一個(gè)登錄按鈕。圖4-9登錄界面Fig.4-9Graphicalof

login2、注冊(cè)界面定義一個(gè)繼承自JPanel類(lèi)的RegisterPanel類(lèi)用來(lái)顯示注冊(cè)界面。界面中用兩個(gè)標(biāo)簽分別顯示“注冊(cè)賬號(hào)”、“已有賬號(hào),去登錄”,用三個(gè)輸入框分別接收用戶(hù)輸入的郵箱、密碼、確認(rèn)密碼;還放置了最小化按鈕、退出按鈕和注冊(cè)按鈕,圖4-10注冊(cè)界面Fig.4-10Graphicalof

register3、等待界面定義一個(gè)繼承自JPanel類(lèi)的WaitPanel類(lèi)用來(lái)顯示等待界面。用一個(gè)線程每間隔500毫秒讓標(biāo)簽顯示不同的等待信息。圖4-11等待界面Fig.4-11Graphicalof

waiting4、注冊(cè)驗(yàn)證界面定義一個(gè)繼承自JPanel類(lèi)的RegisterConfirmPanel類(lèi)用來(lái)顯示注冊(cè)驗(yàn)證界面。界面中用三個(gè)標(biāo)簽分別顯示“請(qǐng)輸入驗(yàn)證碼”、“去登錄”、“重新發(fā)送”,用一個(gè)輸入框接收驗(yàn)證碼,放置一個(gè)確認(rèn)按鈕用于發(fā)送驗(yàn)證碼。圖4-12注冊(cè)驗(yàn)證界面Fig.4-12Graphicalof

registerverification5、客戶(hù)端入口窗體控制面板無(wú)法顯示在畫(huà)面外,因此,我們定義一個(gè)EntryFrame形狀以將面板放在其上。首先,設(shè)置JPanel變量contentPane,將ContentPane表單窗口的視圖設(shè)置為CardLayout,并將上面定義的登錄窗口添加到contentPane。如果您更改頁(yè)面,它將使用show方法切換到CardLayout。6,聊天界面聊天界面分為左側(cè)的黑色菜單欄和右側(cè)的內(nèi)容窗口。菜單欄有一個(gè)用于顯示頭像的標(biāo)簽和四個(gè)用于更改頁(yè)面的按鈕。將灰色背景欄放在內(nèi)容區(qū)域的左側(cè),將輸入框和添加按鈕放在面板頂部,然后在文本框中輸入郵箱或帳號(hào)。將好友請(qǐng)求發(fā)送給對(duì)方。將滾動(dòng)條放在欄下方。在滾動(dòng)窗格中排列列表以顯示朋友列表。點(diǎn)擊好友列表?xiàng)l目即可轉(zhuǎn)到與該好友的對(duì)話頁(yè)面。在內(nèi)容框的右側(cè)放置一個(gè)灰色背景的框。最小化和關(guān)閉按鈕以及別名位于面板的頂部。要查看聊天記錄,請(qǐng)將列表放在面板的中央。每個(gè)對(duì)話記錄都使用標(biāo)簽顯示,列表項(xiàng)使用自己的ImageCellRender類(lèi)以HTML格式顯示組合的圖形和文本內(nèi)容。下面是表情符號(hào)按鈕,文件按鈕和語(yǔ)音聊天請(qǐng)求按鈕。單擊[表情符號(hào)]按鈕將打開(kāi)一個(gè)用于選擇表情符號(hào)的對(duì)話框REF_Ref516172913\r\h錯(cuò)誤!未找到引用源。。您還可以通過(guò)單擊“語(yǔ)音呼叫請(qǐng)求”按鈕發(fā)送語(yǔ)音聊天請(qǐng)求。下面是一個(gè)文本框和一個(gè)提交按鈕。圖4-13聊天界面Fig.4-13Graphicalof

chat圖4-14請(qǐng)求語(yǔ)音通話Figure4-14Requestingavoicecall圖4-14正在語(yǔ)音通話Figure4-14Voicecallisinprogress圖4-14結(jié)束語(yǔ)音通話Figure4-14Endingavoicecall4.2.2客戶(hù)端架構(gòu)定義ViewHandler回調(diào)接口(服務(wù)類(lèi))。ViewHandlers用于更新接口操作,服務(wù)類(lèi)用于封裝諸如join,register和request之類(lèi)的服務(wù)REF_Ref516173015\r\h錯(cuò)誤!未找到引用源。。接下來(lái),定義App類(lèi)并將ViewHandler接口實(shí)現(xiàn)為客戶(hù)端控件和輸入中心。識(shí)別消息的接收者,例如連接,錄音,文本聊天,語(yǔ)音聊天以及將收到的消息轉(zhuǎn)發(fā)到應(yīng)用程序類(lèi)以進(jìn)行處理。App類(lèi)根據(jù)相應(yīng)的消息切換接口并更新接口和其他操作??蛻?hù)端軟件打開(kāi)時(shí),客戶(hù)端首先聯(lián)系服務(wù)器。建立連接后,會(huì)將偵聽(tīng)器添加到連接中。連接客戶(hù)端時(shí),會(huì)添加另一個(gè)耳機(jī)并切換主界面。監(jiān)聽(tīng)器用于接收從服務(wù)器發(fā)送的信息,服務(wù)類(lèi)用于向服務(wù)器發(fā)送數(shù)據(jù)和請(qǐng)求,app類(lèi)將消息發(fā)送到各種接口以執(zhí)行接口切換。4.2.3語(yǔ)音的采集和回放JavaSoundAudioSystem類(lèi)包含單獨(dú)安裝的服務(wù)和第三方集成服務(wù),是音頻組件的交換,是訪問(wèn)采樣音頻應(yīng)用程序的入口點(diǎn)。例如,應(yīng)用程序首先詢(xún)問(wèn)是否存在AudioSystem類(lèi)中具有設(shè)置的混音器。輸入或輸出配置,線性接口等。TargetDataLine接口提供了一種從DataLine緩沖區(qū)讀取音頻捕獲設(shè)備數(shù)據(jù)的方法。記錄音頻的應(yīng)用程序應(yīng)該足夠快地從DataLine讀取數(shù)據(jù)以避免緩沖區(qū)溢出。DataLine接口中可用的方法確定當(dāng)前緩沖區(qū)中的數(shù)據(jù)量。當(dāng)緩沖區(qū)溢出時(shí),將刪除最舊的數(shù)據(jù)并替換為新數(shù)據(jù)。SourceDataLine接口可以將音頻數(shù)據(jù)寫(xiě)入DataLine緩沖區(qū)。在音頻播放期間,必須將數(shù)據(jù)快速寫(xiě)入源數(shù)據(jù)線。如果不這樣做,聲音也不會(huì)填滿。如果音頻因溢出而停止,則會(huì)生成STOP事件,該事件會(huì)在音頻輸出恢復(fù)時(shí)生成START事件。1、語(yǔ)音的采集1)構(gòu)造AudioFormat對(duì)象:使用PCM編碼,每秒采樣44100個(gè)幅值,每個(gè)樣本中的位數(shù)為16,雙通道,一幀4字節(jié),一秒44100幀,單個(gè)樣本以高端字節(jié)順序存儲(chǔ)。AudioFormataudioFormat=newAudioFormat(AudioFormat.Encoding.PCM_SIGNED,44100F,16,2,4,44100F,true);2)根據(jù)指定的信息構(gòu)造DataLine.Info對(duì)象。DataLine.Infoinfo=newDataLine.Info(TargetDataLine.class,audioFormat);3)獲取與指定DataLine.Info對(duì)象中的描述相匹配的TargetDataLine。TargetDataLinetargetDataLine=(TargetDataLine)AudioSystem.getLine(info);4)打開(kāi)指定格式的TargetDataLine,獲取任何所需的系統(tǒng)資源并開(kāi)始運(yùn)行。targetDataLine.open(audioFormat);5)允許TargetDataLine從事數(shù)據(jù)I/O操作。targetDataLine.start();6)從TargetDataLine的輸入緩沖區(qū)中讀取音頻數(shù)據(jù)。targetDataLine.read(data,0,len);2、語(yǔ)音的回放1)構(gòu)造AudioFormat對(duì)象:使用與語(yǔ)音采集時(shí)的音頻編碼技術(shù)、每秒采樣數(shù)、樣本中的位數(shù)、通道數(shù)、每幀中的字節(jié)數(shù)、每秒的幀數(shù)、單個(gè)樣本的存儲(chǔ)順序。AudioFormataudioFormat=newAudioFormat(AudioFormat.Encoding.PCM_SIGNED,44100F,16,2,4,44100F,true);2)根據(jù)指定的信息構(gòu)造DataLine.Info對(duì)象。DataLine.Infoinfo=newDataLine.Info(SourceDataLine.class,audioFormat);3)獲取與指定DataLine.Info對(duì)象中的描述相匹配的Sour

溫馨提示

  • 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ì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論