【正文】
不過我相信我以后會將該設(shè)計的功能繼續(xù)增強(qiáng),從而達(dá)到商業(yè)軟件的標(biāo)準(zhǔn)。不過所幸的是,在面對這些困難的時候,我沒有退縮而是選擇了激流勇進(jìn),最終在指導(dǎo)老師 XXX 和同學(xué)們的幫助下將問題一個個的解決。在該系統(tǒng)中實(shí)現(xiàn)了網(wǎng)絡(luò)聊天系統(tǒng)的一些基本功能,可以滿足大部門用戶在組建局域網(wǎng)后最為其公司的內(nèi)部交流工具之用。因此,必須將系統(tǒng)中的軟件與各種依賴的資源結(jié)合起來,在系統(tǒng)實(shí)際運(yùn)行環(huán)境下來進(jìn)行測試。系統(tǒng)測試是針對整個產(chǎn)品系統(tǒng)進(jìn)行的測試,目的是驗證系統(tǒng)是否滿足了需求規(guī)格的定義,找出與需求規(guī)格不相符合或與之矛盾的地方。測試發(fā)現(xiàn)問題之后要經(jīng)過調(diào)試找出錯誤原因和位置,然后進(jìn)行改正。這階段又可分為三個步驟:模塊測試,測試每個模塊的程序是否有錯誤;組裝測試,測試模塊之間的接口是否正確;確認(rèn)測試,測試整個軟件系統(tǒng)是否滿足用戶功能和性能的要求。圖 文件發(fā)送成功五. 系統(tǒng)測試系統(tǒng)測試是將已經(jīng)確認(rèn)的軟件、計算機(jī)硬件、外設(shè)、網(wǎng)絡(luò)等其他元素結(jié)合在一起,進(jìn)行信息系統(tǒng)的各種組裝測試和確認(rèn)測試,其目的是通過與系統(tǒng)的需求相比較,發(fā)現(xiàn)所開發(fā)的系統(tǒng)與用戶需求不符或矛盾的地方,從而提出更加完善的方案.。圖 接受文件單擊其中的“接受文件”按鈕,即可打開文件保存對話框,用來選擇文件的保存路徑。選擇完成后,在界面上將顯示“正在等待對方接收文件”提示信息,其運(yùn)行效果如圖 所示。 點(diǎn)對點(diǎn)文件傳輸模塊設(shè)計在聊天消息窗口中,不但可以發(fā)送普通的消息文本,還可以發(fā)送文件。 一對多通信模塊設(shè)計在客戶端主界面中單擊“進(jìn)入聊天室”按鈕,就可以打開聊天室消息窗口,從而開始一對多的通信,其運(yùn)行效果如圖 所示。 點(diǎn)對點(diǎn)通信模塊設(shè)計在客戶端主界面中雙擊需要聊天的對象,就可以打開聊天消息窗口,從而開始點(diǎn)對點(diǎn)的通信,其運(yùn)行效果如圖 所示。 客戶端主界面模塊設(shè)計用戶在登錄成功后,將會關(guān)閉登錄窗口,同時打開客戶端主界面,其運(yùn)行效果如圖 和 所示。服務(wù)器會對用戶的注冊信息進(jìn)行判斷,然后返回相應(yīng)的處理結(jié)果。 新用戶注冊模塊設(shè)計在登錄窗口中單擊“注冊新用戶”標(biāo)簽,這是將打開注冊新用戶窗口,其運(yùn)行效果如圖 所示。圖 登錄窗口在登錄窗口中輸入正確的賬戶和密碼信息,然后單擊“登錄”按鈕,即可向服務(wù)器發(fā)送登錄請求。}}} 客戶端設(shè)計 客戶端登錄模塊設(shè)計客戶端登錄模塊用來判斷用戶是否為合法用戶,如果是則可以登錄到客戶端主界面,否則將無法進(jìn)入。 (codeline)。 while(()){ String a =(String) ()。 }}}else{//發(fā)送群消息Set set = ()。 PrintStream pss = (PrintStream)(a)。 } Iterator iit=()。 while(()){ String a =(String) ()。 Iterator it = ()。 (())。 while(()){ String a =(String) ()。 (a+,)。 StringBuffer sb=new StringBuffer(,)。if((在線)){Set set = ()。}}else if((=states=)){String user=(=)[0]。if(writeToFile(na, psw)){(=true)。}else if((=)){String na=(=)[1]。 PrintStream pss=(nme)。 }}else if((giveip=)){//要ip,并發(fā)回對應(yīng) Ip String nme=(=)[1]。 PrintStream pss = (PrintStream)(a)。 } Iterator iit=()。 while(()){ String a =(String) ()。 Iterator it = ()。 (leave)。 (leave+下線)。}}else{(false)。 (())。 while(()){ String a =(String) ()。 (a+,)。 StringBuffer sb=new StringBuffer(,)。 Set set = ()。 (username, sadress)。 = ()[1]。)。while(true){String codeline= ()。PrintStream ps = new PrintStream(())。String username。String sadress。前一個請求在完成所有的交互操作后自動退出,同時連接也將關(guān)閉,其實(shí)現(xiàn)代碼如下。}}} 服務(wù)器處理客戶端信息線程設(shè)計當(dāng)服務(wù)器等待連接線程接收到一個新的套接字連接后,就會啟動一個新的服務(wù)器處理客戶端信息線程來負(fù)責(zé)本服務(wù)器和該客戶端之間的連接,同時該在線程中的 run 方法中處理客戶端的請求。()。ServerRead sr=new ServerRead()。class ServerAccept extends Thread{public void run(){try {while(true){Socket s。本系統(tǒng)服務(wù)器端程序需要借助于 Java 語言的多線程機(jī)制來完成。網(wǎng)絡(luò)聊天軟件服務(wù)器端客戶端建立連接操作數(shù)據(jù)庫監(jiān)聽客戶端查找用戶信息添加用戶信息更新用戶信息刪除用戶信息注冊用戶用戶登錄查看好友發(fā)送聊天信息進(jìn)入聊天室退出聊天軟件發(fā)送注冊請求發(fā)送登錄請求打開主界面通知服務(wù)器通知其他好友獲得注冊號碼圖 系統(tǒng)的功能模塊圖四. 系統(tǒng)功能模塊設(shè)計 服務(wù)器端的設(shè)計服務(wù)器端需要完成三大功能,分別是與客戶端建立連接、監(jiān)聽客戶端消息以及操作數(shù)據(jù)庫。這樣可以合理的將各個任務(wù)分配至客戶端和服務(wù)器端,從而降低系統(tǒng)的通信開銷。 系統(tǒng)的架構(gòu)模式本聊天系統(tǒng)采用的是目前流行服務(wù)器/客戶端架構(gòu)來設(shè)置的,同時采用了三層架構(gòu)??蛻舳朔?wù)器 客戶端發(fā)送消息 , 并指定接受方 根據(jù)接受的消息轉(zhuǎn)發(fā)給客戶端發(fā)送消息 , 并指定接受方根據(jù)接受的消息轉(zhuǎn)發(fā)給客戶端圖 通信示意圖需要注意的是,客戶端同客戶端之間并沒有直接的聯(lián)系,而是通過服務(wù)器作為中轉(zhuǎn)站的形式來完成數(shù)據(jù)傳輸?shù)?。?chuàng)建 S e r v e r S o c k e t 套接字服務(wù)器創(chuàng)建過程和本機(jī) I P 地址綁定監(jiān)聽指定端口并阻塞響應(yīng)客戶端請求創(chuàng)建 S o c k e t 套接字客戶端創(chuàng)建過程向指定 I P 地址的服務(wù)器的指定端口發(fā)送請求和客戶端建立連接 , 并相互發(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 對象圖 客戶端和服務(wù)器創(chuàng)建流程圖在 Java 的基于 TCP/IP 協(xié)議的 Socket 編程中,服務(wù)端使用 ServerSocket類開創(chuàng)建,而客戶端使用的 Socket 類。以保證在系統(tǒng)完成之后有一個模擬環(huán)境,進(jìn)行必要的測試。系統(tǒng)開發(fā)工具是采用的Eclipse 集成開發(fā)環(huán)境。因此在經(jīng)濟(jì)方面是可行的。所用的軟件主要是 Eclipse,該軟件目前是開源和免費(fèi)的。為了保證軟件產(chǎn)品的質(zhì)量,系統(tǒng)的開發(fā)周期應(yīng)該控制在 1 個月左右,并且要保證充足的調(diào)研時間和測試周期。所以本系統(tǒng)在技術(shù)上是可行的。如圖 ,因為 C/S 以它的靈活性,通用性,易操作性等特點(diǎn)在用戶呈現(xiàn)方面一致是比較好的選擇。同時,基于 Java 語言的設(shè)計模式的發(fā)展為軟件的設(shè)計提供了大量的可供選擇的解決方案,保證了系統(tǒng)軟件的實(shí)現(xiàn)效率和運(yùn)行過程中的邏輯健壯性。因此,在系統(tǒng)的使用方面不會存在問題。 用戶可行性本系統(tǒng)服務(wù)的對象是各大公司的技術(shù)人員,使用人員主要是掌握計算機(jī)基本操作技能的知識分子。 社會可行性隨著計算機(jī)的發(fā)展與普及,以及互聯(lián)網(wǎng)技術(shù)的擴(kuò)展,很多的公司和企業(yè)都提供了局域網(wǎng)信息服務(wù)。 可行性分析可行性分析(Feasibility Analysis)也稱為可行性研究,是在系統(tǒng)調(diào)查的基礎(chǔ)上,針對新系統(tǒng)的開發(fā)是否具備必要性和可能性,對新系統(tǒng)的開發(fā)從技術(shù)、經(jīng)濟(jì)、社會的方面進(jìn)行分析和研究,以避免投資失誤,保證新系統(tǒng)的開發(fā)成功。當(dāng)有錯誤發(fā)生時,我們應(yīng)該有一個很好的機(jī)制來保障錯誤能夠及時地被排除。當(dāng)一個窗體出現(xiàn)問題時能夠及時的處理,讓主程序不受影響。因此我們將采用多線程方式的并發(fā)服務(wù)器來設(shè)計服務(wù)器端,這樣將能從很大程度上提高服務(wù)器的運(yùn)行效率。首先,服務(wù)器需要同時連接很多個用戶,并能提供給這些連接用戶所需要的任務(wù)處理請求,這就要求服務(wù)器能同時處理多個 Socket 連接。 需求分析為了開發(fā)出符合要求的網(wǎng)絡(luò)聊天程序,首先必須知道使用者的需求。Java 語言提供了專門機(jī)制以解決這種沖突,有效避免了同一個數(shù)據(jù)對象被多個線程同時訪問。 你可以調(diào)用 Thread 類的方法 getPriority() 和 setPriority()來存取線程的優(yōu)先級,線程的優(yōu)先級界于 1(MIN_PRIORITY)和 10(MAX_PRIORITY)之間,缺省是 5(NORM_PRIORITY)。 4. 阻塞狀態(tài):線程不會被分配 CPU 時間,無法執(zhí)行。 3. 死亡狀態(tài):正常情況下 run() 返回使得線程死亡。 2. 可執(zhí)行狀態(tài):線程可以執(zhí)行,雖然不一定正在執(zhí)行。 使用 Runnable 接口來實(shí)現(xiàn)多線程使得我們能夠在一個類中包容所有的代碼,有利于封裝,它的缺點(diǎn)在于,我們只能使用一套代碼,若想創(chuàng)建多個線程并使各個線程執(zhí)行不同的代碼,則仍必須額外創(chuàng)建類,如果這樣的話,在大多數(shù)情況下也許還不如直接用多個類分別繼承 Thread 來得緊湊。i++) new Thread(new MyThread(i+1)).start()。 } } public static void main(String args[]){ for(int i = 0。 } public void run(){ while(true){ (線程 + number + :計數(shù) + count)。 public MyThread(int num){ number = num。來實(shí)現(xiàn)。 方法二:實(shí)現(xiàn) Runnable 接口 Runnable 接口只有一個方法 run(),我們聲明自己的類實(shí)現(xiàn) Runnable 接口并提供這一方法,將我們的線程代碼寫入其中,就完成了這一部分的任務(wù)。但