【正文】
生活也是離不開網(wǎng)絡(luò)。當(dāng)前人們進(jìn)行信息交流的方式非常多,例如電報(bào)、電話、電子郵件等通訊手段?,F(xiàn)如今已有很多的網(wǎng)絡(luò)聊天系統(tǒng),例如騰訊的 、微信、阿里旺旺等等。所做的主要工作本課題主要研究的是基于 Socket 的聊天軟件,對(duì)于這個(gè)聊天軟件的設(shè)計(jì)是分為服務(wù)器程序和客戶端程序,本課題的目標(biāo)是能實(shí)現(xiàn)用戶在客戶端與服務(wù)器端傳遞信息。高斯林(James Gosling)等人于 1990年代初開發(fā)。Java 伴隨著互聯(lián)網(wǎng)的迅猛發(fā)展而發(fā)展,成為當(dāng)今計(jì)算機(jī)業(yè)界不可忽視的力量和重要的發(fā)展潮流與方向。經(jīng)過他們的精心鉆研和努力,便促成了 Java語(yǔ)言的誕生。目前,全球 Java 開發(fā)人員已經(jīng)超過 450 萬(wàn),因此 Java 社區(qū)是一個(gè)充滿活力和創(chuàng)新精神的團(tuán)隊(duì),這正是 Java 更加繁榮的保障。(3)Java 的語(yǔ)法長(zhǎng)春理工大學(xué)光電信息學(xué)院畢業(yè)設(shè)計(jì) 4 Java 是面向?qū)ο蟮某绦蛟O(shè)計(jì)語(yǔ)言,其基本語(yǔ)法和 C 語(yǔ)言大致相同。?Java 去掉了 C 語(yǔ)言的指針。和 C++相比,Java 不支持多繼承的概念,目的是為了避免對(duì)象和對(duì)象之間的關(guān)系復(fù)雜化。 Socket 編程Socket 接口是訪問 Inter 使用得最廣泛的方法。這樣,在另一臺(tái)主機(jī)或同一臺(tái)主機(jī)上執(zhí)行ftp ,F(xiàn)TP 客戶軟件將通過 21 端口來(lái)呼叫主機(jī)上由 FTP 服務(wù)軟件提供的 Socket,與其建立連接并對(duì)話。Socket 正如其英文原意那樣,像一個(gè)多孔插座。應(yīng)用程序通常通過套接字向網(wǎng)絡(luò)發(fā)出請(qǐng)求或者應(yīng)答網(wǎng)絡(luò)請(qǐng)求。對(duì)于一個(gè)網(wǎng)絡(luò)連接長(zhǎng)春理工大學(xué)光電信息學(xué)院畢業(yè)設(shè)計(jì) 5 來(lái)說,套接字是平等的,并沒有差別,不因?yàn)樵诜?wù)器端或在客戶端而產(chǎn)生不同級(jí)別。阻塞是一個(gè)術(shù)語(yǔ),它使程序運(yùn)行暫時(shí)停留在這個(gè)地方,直到一個(gè)會(huì)話產(chǎn)生,然后程序繼續(xù);通常阻塞是由循環(huán)產(chǎn)生的。 服務(wù)器,使用 ServerSocket 監(jiān)聽指定的端口,端口可以隨意指定(由于1024 以下的端口通常屬于保留端口,在一些操作系統(tǒng)中不可以隨意使用,所以建議使用大于 1024 的端口) ,等待客戶連接請(qǐng)求,客戶連接后,會(huì)話產(chǎn)生;在完成會(huì)話后,關(guān)閉連接。要學(xué) Inter 上的TCP/IP 網(wǎng)絡(luò)編程,必須理解 Socket 接口。Socket 也具有一個(gè)類似于打開文件的函數(shù)調(diào)用 Socket(),該函數(shù)返回一個(gè)整型的 Socket 描述符,隨后的連接建立、數(shù)據(jù)傳輸?shù)炔僮鞫际峭ㄟ^該Socket 實(shí)現(xiàn)的。 網(wǎng)絡(luò)接口層:它定義了將資料組成正確幀的規(guī)程和在網(wǎng)絡(luò)中傳輸幀的規(guī)程,幀是指一串資料,它是資料在網(wǎng)絡(luò)中傳輸?shù)膯挝弧?(2)網(wǎng)間協(xié)議 IP Inter 上使用的一個(gè)關(guān)鍵的底層協(xié)議是網(wǎng)際協(xié)議,通常稱 IP 協(xié)議。 計(jì)算機(jī)的通信協(xié)議精確地定義了計(jì)算機(jī)在彼此通信過程的所有細(xì)節(jié)。為此使用 Inter 的每臺(tái)計(jì)算機(jī)都必須運(yùn)行 IP 軟件,以便時(shí)刻準(zhǔn)備發(fā)送或接收信息。因此,若要解決可能出現(xiàn)的問題,連上 Inter 的計(jì)算機(jī)還需要安裝 TCP 協(xié)議來(lái)提供可靠的并且無(wú)差錯(cuò)的通信服務(wù)。即使在 Inter 暫時(shí)出現(xiàn)堵塞的情況下,TCP 也能夠保證通信的可靠。 綜上所述,雖然 IP 和 TCP 這兩個(gè)協(xié)議的功能不盡相同,也可以分開單獨(dú)使用,但它們是在同一時(shí)期作為一個(gè)協(xié)議來(lái)設(shè)計(jì)的,并且在功能上也是互補(bǔ)的。它以抽象窗口工具包(AWT)為基礎(chǔ)使跨平臺(tái)應(yīng)用程序可以使用任何可插拔的外觀風(fēng)格。例如 AWT 缺少剪貼板、打印支持、鍵盤導(dǎo)航等特性,而且原來(lái)的 AWT 甚至不包括彈出式菜單或滾動(dòng)窗格等基本元素。Swing 是由 100%純 Java 實(shí)現(xiàn)的,Swing 組件是用 Java 實(shí)現(xiàn)的輕量級(jí)( lightweight)組件,沒有本地代碼,不依賴操作系統(tǒng)的支持,這是它與 AWT組件的最大區(qū)別。Swing 外觀感覺采用可插入的外觀感覺(Pluggable Look and 長(zhǎng)春理工大學(xué)光電信息學(xué)院畢業(yè)設(shè)計(jì) 8 Feel,PLamp。 多線程技術(shù)介紹多線程是這樣一種機(jī)制,它允許在程序中并發(fā)執(zhí)行多個(gè)指令流,每個(gè)指令流都稱為一個(gè)線程,彼此間互相獨(dú)立。多線程和傳統(tǒng)的單線程在程序設(shè)計(jì)上最大的區(qū)別在于,由于各個(gè)線程的控制流彼此獨(dú)立,使得各個(gè)線程之間的代碼是亂序執(zhí)行的,由此帶來(lái)的線程調(diào)度,同步等問題。Thread 類最重要的方法是 run(),它為 Thread 類的方法 start()所調(diào)用,提供我們的線程所要執(zhí)行的代碼。 (創(chuàng)建線程 + number)。 i 〈 5。 那么如何限制這個(gè)類必須包含這一方法呢?當(dāng)然是使用接口?。m然抽象類也可滿足,但是需要繼承,而我們之所以要采用這種新方法,不就是為了避免繼承帶來(lái)的限制嗎?) Java 提供了接口 來(lái)支持這種方法。下面是一個(gè)例子: public class MyThread implements Runnable{ int count= 1, number。 if(++count== 6) return。 } }嚴(yán)格地說,創(chuàng)建 Thread 子類的實(shí)例也是可行的,但是必須注意的是,該子類必須沒有覆蓋 Thread 類的 run 方法,否則該線程執(zhí)行的將是子類的 run 方法,而不是我們用以實(shí)現(xiàn) Runnable 接口的類的 run 方法,對(duì)此大家不妨試驗(yàn)一下。CPU 時(shí)間隨時(shí)可能被分配給該線程,從而使得它執(zhí)行。(3)線程的優(yōu)先級(jí)線程的優(yōu)先級(jí)代表該線程的重要程度,當(dāng)有多個(gè)線程同時(shí)處于可執(zhí)行狀態(tài)并等待獲得 CPU 時(shí)間時(shí),線程調(diào)度系統(tǒng)根據(jù)各個(gè)線程的優(yōu)先級(jí)來(lái)決定給誰(shuí)分配 CPU 時(shí)間,優(yōu)先級(jí)高的線程有更大的機(jī)會(huì)獲得 CPU 時(shí)間,優(yōu)先級(jí)低的線程也不是沒有機(jī)會(huì),只是機(jī)會(huì)要小一些罷了。 由于我們可以通過 private 關(guān)鍵字來(lái)保證數(shù)據(jù)對(duì)象只能被方法訪問,所以我們只需針對(duì)方法提出一套機(jī)制,這套機(jī)制就是 synchronized 關(guān)鍵字,它包括兩種用法:synchronized 方法和 synchronized 塊。因此我們將采用多線程方式的并發(fā)服務(wù)器來(lái)設(shè)計(jì)服務(wù)器端,這樣將能從很大程度上提高服務(wù)器的運(yùn)行效率。當(dāng)有錯(cuò)誤發(fā)生時(shí),我們應(yīng)該有一個(gè)很好的機(jī)制來(lái)保障錯(cuò)誤能夠及時(shí)地被排除。 社會(huì)可行性根據(jù)目前的計(jì)算機(jī)發(fā)展來(lái)看,公司幾乎都是有網(wǎng)路需要的,無(wú)論是公網(wǎng)還是私網(wǎng),很多公司和企業(yè)或者校園都提供了局域網(wǎng)信息服務(wù)。因此,在系統(tǒng)的使用方面不會(huì)存在問題。如圖 ,因?yàn)?C/S 以它的靈活性,通用性,易操作性等特點(diǎn)在用戶呈現(xiàn)方面一致是比較好的選擇。為了保證軟件產(chǎn)品的質(zhì)量,系統(tǒng)的開發(fā)周期應(yīng)該控制在 1 個(gè)月左右,并且要保證充足的調(diào)研時(shí)間和測(cè)試周期。因此在經(jīng)濟(jì)方面是可行的。以保證在系統(tǒng)完成之后有一個(gè)模擬環(huán)境,進(jìn)行必要的測(cè)試。 數(shù)據(jù)庫(kù)概念設(shè)計(jì)本系統(tǒng)的數(shù)據(jù)庫(kù)概念設(shè)計(jì)主要用關(guān)系實(shí)體模型,即 ER 模型。另一種是按用戶要求數(shù)據(jù)庫(kù)提供的服務(wù)歸納成幾類,是每一類應(yīng)用訪問的數(shù)據(jù)顯地不通于其他類,然后為每類應(yīng)用設(shè)計(jì)一個(gè)局部的 ER 模式。長(zhǎng)春理工大學(xué)光電信息學(xué)院畢業(yè)設(shè)計(jì) 14 創(chuàng)建 S e r v e r S o c k e t 套接字服務(wù)器創(chuàng)建過程和本機(jī) I P 地址綁定監(jiān)聽指定端口并阻塞響應(yīng)客戶端請(qǐng)求創(chuàng)建 S o c k e t 套接字客戶端創(chuàng)建過程向指定 I P 地址的服務(wù)器的指定端口發(fā)送請(qǐng)求和客戶端建立連接 , 并相互發(fā)送消息和服務(wù)器端建立連接 ,并相互發(fā)送消息關(guān)閉 S o c k e t 連接 關(guān)閉 S o c k e t 連接關(guān)閉 S e r v e r S o c k e t 對(duì)象圖 客戶端和服務(wù)器創(chuàng)建流程圖在 Java 的基于 TCP/IP 協(xié)議的 Socket 編程中,服務(wù)端使用 ServerSocket類開創(chuàng)建,而客戶端使用的 Socket 類。長(zhǎng)春理工大學(xué)光電信息學(xué)院畢業(yè)設(shè)計(jì) 15 C/S 的架構(gòu)模式本聊天系統(tǒng)采用的是目前流行 C/S 架構(gòu)來(lái)設(shè)置的,同時(shí)采用了三層架構(gòu)。網(wǎng)絡(luò)聊天軟件服務(wù)器端客戶端建立連接操作數(shù)據(jù)庫(kù)監(jiān)聽客戶端查找用戶信息添加用戶信息更新用戶信息刪除用戶信息注冊(cè)用戶用戶登錄查看好友發(fā)送聊天信息進(jìn)入聊天室退出聊天軟件發(fā)送注冊(cè)請(qǐng)求發(fā)送登錄請(qǐng)求打開主界面通知服務(wù)器通知其他好友獲得注冊(cè)號(hào)碼圖 系統(tǒng)的功能模塊圖第四章. 各功能模塊設(shè)計(jì) 服務(wù)器端的設(shè)計(jì)服務(wù)器端需要完成三大功能,分別是與客戶端建立連接、監(jiān)聽客戶端消息以及操作數(shù)據(jù)庫(kù)。class ServerAccept extends Thread{public void run(){try {while(true){Socket s。()。前一個(gè)請(qǐng)求在完成所有的交互操作后自動(dòng)退出,同時(shí)連接也將關(guān)閉,其實(shí)現(xiàn)代碼如下。String username。長(zhǎng)春理工大學(xué)光電信息學(xué)院畢業(yè)設(shè)計(jì) 17 while(true){String codeline= ()。 = ()[1]。 Set set = ()。 (a+,)。 (())。 (leave+下線)。 Iterator it = ()。 } Iterator iit=()。 }}else if((giveip=)){//要ip,并發(fā)回對(duì)應(yīng) Ip String nme=(=)[1]。}else if((=)){String na=(=)[1]。}}else if((=states=)){String user=(=)[0]。 StringBuffer sb=new StringBuffer(,)。 while(()){ String a =(String) ()。 Iterator it = ()。 } Iterator iit=()。 }}}else{//發(fā)送群消息Set set = ()。 (codeline)。圖 登錄窗口在登錄窗口中輸入正確的賬戶和密碼信息,然后單擊“登錄”按鈕,即可向服務(wù)器發(fā)送登錄請(qǐng)求。服務(wù)器會(huì)對(duì)用戶的注冊(cè)信息進(jìn)行判斷,然后返回相應(yīng)的處理結(jié)果。 點(diǎn)對(duì)點(diǎn)通信模塊設(shè)計(jì)在客戶端主界面中雙擊需要聊天的對(duì)象,就可以打開聊天消息窗口,從而開始點(diǎn)對(duì)點(diǎn)的通信,其運(yùn)行效果如圖 所示。長(zhǎng)春理工大學(xué)光電信息學(xué)院畢業(yè)設(shè)計(jì) 24 點(diǎn)對(duì)點(diǎn)文件傳輸模塊設(shè)計(jì)在聊天消息窗口中,不但可以發(fā)送普通的消息文本,還可以發(fā)送文件。圖 接受文件單擊其中的“接受文件”按鈕,即可打開文件保存對(duì)話框,用來(lái)選擇文件長(zhǎng)春理工大學(xué)光電信息學(xué)院畢業(yè)設(shè)計(jì) 25 的保存路徑。這階段又可分為三個(gè)步驟:模塊測(cè)試,測(cè)試每個(gè)模塊的程序是否有錯(cuò)誤;組裝測(cè)試,測(cè)試模塊之間的接口是否正確;確認(rèn)測(cè)試,測(cè)試整個(gè)軟件系統(tǒng)是否滿足用戶功能和性能的要求。系統(tǒng)測(cè)試是針對(duì)整個(gè)產(chǎn)品系統(tǒng)進(jìn)行的測(cè)試,目的是驗(yàn)證系統(tǒng)是否滿足了需求規(guī)格的定義,找出與需求規(guī)格不相符合或與之矛盾的地方。可以滿足大部門用戶在組建局域網(wǎng)后作為安全便捷的內(nèi)部交流工具之用。不過我相信在以后的學(xué)習(xí)中會(huì)繼續(xù)完善它。=s。String sadress。PrintStream ps = new PrintStream(())。)。 (username, sadress)。 StringBuffer sb=new StringBuffer(,)。 while(()){ String a =(String) ()。}}else{(false)。 (leave)。 while(()){ String a =(String) ()。 PrintStream pss = (PrintStream)(a)。 PrintStream pss=(nme)。if(writeToFile(na, psw)){(=true)。if((在線)){Set set = ()。 (a+,)。 (())。 while(()){ String a =(String) ()。 PrintStream pss = (PrintStream)(a)。 while(()){ String a =(String) ()。}}