版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、<p><b> 計算機網(wǎng)絡(luò)</b></p><p><b> 課程設(shè)計</b></p><p> 題目:聊天程序的設(shè)計和實現(xiàn)</p><p><b> 學(xué)院:計算機</b></p><p><b> 課程設(shè)計任務(wù)書</b></p
2、><p> 說明:1、學(xué)院、專業(yè)、年級均填全稱,如:光電工程學(xué)院、測控技術(shù)、2003。</p><p> 2、本表除簽名外均可采用計算機打印。本表不夠,可另附頁,但應(yīng)在頁腳添加頁碼。</p><p><b> 目 錄</b></p><p><b> 摘 要2</b></p
3、><p><b> 一 需求分析3</b></p><p> 1.1 開發(fā)背景3</p><p> 1.2 功能要求3</p><p> 1.3 主要涉及的編程知識3</p><p> 1.4 編程語言及環(huán)境3</p><p><b>
4、二 總體設(shè)計4</b></p><p> 2.1 系統(tǒng)實現(xiàn)的基本原理4</p><p> 2.2 系統(tǒng)功能5</p><p> 2.2.1服務(wù)器端的主要功能5</p><p> 2.2.2客戶端的主要功能5</p><p> 2.3 系統(tǒng)運行數(shù)據(jù)流程圖6</p>&
5、lt;p> 2.4 功能模塊7</p><p> 2.4.1 服務(wù)器功能模塊流程圖7</p><p> 2.4.2 客戶端功能模塊流程圖8</p><p><b> 三 詳細設(shè)計9</b></p><p> 3.1系統(tǒng)體系協(xié)議設(shè)計9</p><p> 3.2聊天室
6、服務(wù)器端設(shè)計10</p><p> 3.2.1 ChatServer類10</p><p> 3.2.2 ClientProc類11</p><p> 3.3聊天室客戶端設(shè)計13</p><p> 3.3.1 ChatFrame類13</p><p> 3.3.2 Connect類16</p
7、><p> 3.3.3 Plist類16</p><p> 3.3.4 PopupListener類16</p><p> 3.3.5 Acceptfilethread&Sendfilethread類16</p><p> 四 系統(tǒng)實現(xiàn)與調(diào)試分析18</p><p> 4.1聊天室服務(wù)器運行效果
8、18</p><p> 4.2聊天室客戶端用例運行效果19</p><p> 4.3結(jié)果分析與問題解決21</p><p><b> 五 總 結(jié)22</b></p><p><b> 參考文獻23</b></p><p><b> 摘 要<
9、;/b></p><p> 隨著 “E時代”的到來 ,網(wǎng)絡(luò)觀念深入人心。網(wǎng)絡(luò)聊天室是在一個網(wǎng)站中,供許多人通過文字與符號進行實時(您輸入的內(nèi)容馬上就能被別人看見)交談、聊天的場所,它是一個向整個因特網(wǎng)開放的地方。為了加深理解和應(yīng)用網(wǎng)絡(luò)編程,實現(xiàn)網(wǎng)絡(luò)聊天的功能,本次課程設(shè)計采用Windows Socket編程,服務(wù)器與客戶端采用了TCP/IP連接方式,在設(shè)計聊天方案時,實行將所有信息發(fā)往服務(wù)器端,再由服務(wù)器
10、進行分別處理的思路,服務(wù)器端是所有信息的中心。本聊天室程序設(shè)計基于C/S模式,聊天室共分為服務(wù)器端和客戶端兩部分,服務(wù)器端程序主要負責偵聽客戶端發(fā)來的消息,客戶端需登陸到服務(wù)器才可以實現(xiàn)正常的聊天功能。而聊天系統(tǒng)是一個開放的基于Java的應(yīng)用開發(fā)設(shè)計,其主要特點是動態(tài)的,實時的來完成信息的傳遞,并擁有大量的客戶請求的高效互動,更有效地處理。</p><p> 本文圍繞Java編程語言在網(wǎng)絡(luò)編程方面的具體應(yīng)用,論
11、述了使用面向?qū)ο蠓椒?,對程序進行如下探討:</p><p> 1.需求分析 2.總體設(shè)計 3.詳細設(shè)計</p><p> 最后使用Java編程實現(xiàn)的全過程。在編程我們使用的java語言,是目前比較流行的編程語言。Java語言最大的特點是具有跨平臺性,使其不受平臺不同的影響,得到了廣泛的應(yīng)用。</p><p> 本次課程設(shè)計的詳細分工如下:<
12、;/p><p> 20095544張駒強,完成本次實驗服務(wù)器設(shè)計與聊天室信息傳輸控制協(xié)議的設(shè)計等過程,并參與文檔與測試工作,占總工作量的33.3%;</p><p> 20095545張源,完成本次系統(tǒng)功能流程設(shè)計與文件收發(fā)功能的設(shè)計等過程,并參與文檔與測試工作,占總工作量的33.3%;</p><p> 20095547朱俊逸,完成本次實驗聊天室數(shù)據(jù)結(jié)構(gòu)設(shè)計等過
13、程,并參與文檔與測試工作,占總工作量的33.3%。</p><p> 關(guān)鍵詞: 聊天室,JAVA,Windows Socket</p><p><b> 一 需求分析</b></p><p><b> 1.1 開發(fā)背景</b></p><p> 在網(wǎng)絡(luò)越來越發(fā)達的今天,人們對網(wǎng)絡(luò)的依賴越
14、來越多,越來越離不開網(wǎng)絡(luò),由此而產(chǎn)生的聊天工具越來越多,類似QQ、網(wǎng)絡(luò)聊天一類的聊天系統(tǒng)的發(fā)展日新月異。因此,我門設(shè)計了這個網(wǎng)絡(luò)聊天工具的,而且通過制作該程序還能更好的學(xué)習(xí)網(wǎng)絡(luò)軟件編程知識。</p><p> 本系統(tǒng)所要實現(xiàn)的主要功能是為廣大用戶提供一個借助網(wǎng)絡(luò)進行人際交往的平臺。因為服務(wù)器端采用多線程,所以性能有很大提升。因為服務(wù)端和客戶端之間采用TCP協(xié)議進行網(wǎng)絡(luò)通信,建立的是可靠的、端到端的網(wǎng)絡(luò)連接,所以
15、可靠性和安全性都很好。</p><p><b> 1.2 功能要求</b></p><p> 服務(wù)器功能,用于監(jiān)聽與發(fā)送廣播信息;</p><p><b> 客戶登錄功能;</b></p><p> 客戶可以一對一和多對多聊天功能;</p><p> 客戶端程序可
16、以實時顯示其它在線的用戶;</p><p> (5)客戶之間可以點對點傳輸文件。</p><p> 1.3 主要涉及的編程知識</p><p> 基于TCP的Socket通信編程、GUI程序設(shè)計、事件處理、多線程技術(shù)、輸入輸出處理、異常處理等。</p><p> 1.4 編程語言及環(huán)境</p><p>
17、在編程中我們使用的是目前比較流行的編程語言------java語言。</p><p> 開發(fā)環(huán)境選擇了IBM公司研發(fā)的Eclipse SDK 3.7.0版本。</p><p><b> 二 總體設(shè)計</b></p><p> 為實現(xiàn)網(wǎng)絡(luò)聊天的功能,本次課程設(shè)計采用Winsock API編程,服務(wù)器與客戶端采用了TCP/IP連接方式,同時,
18、聊天室共分為服務(wù)器端和客戶端兩部分,服務(wù)器端程序主要負責偵聽與轉(zhuǎn)發(fā)客戶端發(fā)來的消息,客戶端需登陸到服務(wù)器才可以實現(xiàn)正常的聊天功能。</p><p> 2.1 系統(tǒng)實現(xiàn)的基本原理</p><p> 本系統(tǒng)在Microsoft Windows下通過TCP協(xié)議建立網(wǎng)絡(luò)應(yīng)用程序,需要使用Socket套接口編程技術(shù)。</p><p> 所謂socket通常也稱作&qu
19、ot;套接字",應(yīng)用程序通常通過"套接字"向網(wǎng)絡(luò)發(fā)出請求或者應(yīng)答網(wǎng)絡(luò)請求。以J2SDK-1.3為例,Socket和ServerSocket類庫位于java .net包中。ServerSocket用于服務(wù)器端,Socket是建立網(wǎng)絡(luò)連接時使用的。在連接成功時,應(yīng)用程序兩端都會產(chǎn)生一個Socket實例,操作這個實例,完成所需的會話。對于一個網(wǎng)絡(luò)連接來說,套接字是平等的,并沒有差別,不因為在服務(wù)器端或在客戶端而產(chǎn)
20、生不同級別。不管是Socket還是ServerSocket它們的工作都是通過SocketImpl類及其子類完成的。 </p><p> 根據(jù)連接啟動的方式以及本地套接字要連接的目標,套接字之間的連接過程可以分為三個步驟:服務(wù)器監(jiān)聽,客戶端請求,連接確認?! ?lt;/p><p> 服務(wù)器監(jiān)聽:是服務(wù)器端套接字并不定位具體的客戶端套接字,而是處于等待連接的狀態(tài),實時監(jiān)控網(wǎng)絡(luò)狀態(tài)?! ?lt;
21、/p><p> 客戶端請求:是指由客戶端的套接字提出連接請求,要連接的目標是服務(wù)器端的套接字。為此,客戶端的套接字必須首先描述它要連接的服務(wù)器的套接字,指出服務(wù)器端套接字的地址和端口號,然后就向服務(wù)器端套接字提出連接請求。 </p><p> 連接確認:是指當服務(wù)器端套接字監(jiān)聽到或者說接收到客戶端套接字的連接請求,它就響應(yīng)客戶端套接字的請求,建立一個新的線程,把服務(wù)器端套接字的描述發(fā)給客戶
22、端,一旦客戶端確認了此描述,連接就建立好了。而服務(wù)器端套接字繼續(xù)處于監(jiān)聽狀態(tài),繼續(xù)接收其他客戶端套接字的連接請求。 </p><p><b> 開發(fā)原理:</b></p><p> 服務(wù)器,使用ServerSocket監(jiān)聽指定的端口,端口可以隨意指定(由于1024以下的端口通常屬于保留端口,在一些操作系統(tǒng)中不可以隨意使用,所以建議使用大于1024的端口),等待客戶
23、連接請求,客戶連接后,會話產(chǎn)生;在完成會話后,關(guān)閉連接。 </p><p> 客戶端,使用Socket對網(wǎng)絡(luò)上某一個服務(wù)器的某一個端口發(fā)出連接請求,一旦連接成功,打開會話;會話完成后,關(guān)閉Socket??蛻舳瞬恍枰付ù蜷_的端口,通常臨時的、動態(tài)的分配一個1024以上的端口?! ocket接口是TCP/IP網(wǎng)絡(luò)的API,Socket接口定義了許多函數(shù)或例程,程序員可以用它們來開發(fā)TCP/IP網(wǎng)絡(luò)上的應(yīng)用程序。
24、要學(xué)Internet上的TCP/IP網(wǎng)絡(luò)編程,必須理解Socket接口。Socket接口設(shè)計者最先是將接口放在Unix操作系統(tǒng)里面的。如果了解Unix系統(tǒng)的輸入和輸出的話,就很容易了解Socket了。網(wǎng)絡(luò)的Socket數(shù)據(jù)傳輸是一種特殊的I/O,Socket也是一種文件描述符。Socket也具有一個類似于打開文件的函數(shù)調(diào)用Socket(),該函數(shù)返回一個整型的Socket描述符,隨后的連接建立、數(shù)據(jù)傳輸?shù)炔僮鞫际峭ㄟ^該Socket實現(xiàn)的
25、。 </p><p><b> 2.2 系統(tǒng)功能</b></p><p> 2.2.1服務(wù)器端的主要功能</p><p> 啟動后進行監(jiān)聽,等待客戶端連接;</p><p> 顯示系統(tǒng)各種工作的信息,如用戶上線和用戶信息交流等信息;</p><p><b> 顯示在線用戶信息
26、;</b></p><p> 向已經(jīng)連接到服務(wù)端的用戶發(fā)送廣播消息和系統(tǒng)信息;</p><p> 退出時,斷開所有的用戶連接。</p><p> 2.2.2客戶端的主要功能</p><p> 登錄功能,連接到已經(jīng)開啟的服務(wù)器并可以隨時登錄和注銷;</p><p> 用戶可以配置要連接服務(wù)器端的IP
27、地址和端口號;</p><p> 用戶可以設(shè)置自己的用戶名與性別;</p><p> 用戶可以向所有人或者個人發(fā)送群消息或私聊消息;</p><p> 用戶可以點對點發(fā)送和接受文件。</p><p> 2.3 系統(tǒng)運行數(shù)據(jù)流程圖</p><p><b> 圖2-1</b></p&
28、gt;<p><b> 2.4 功能模塊</b></p><p> 2.4.1 服務(wù)器功能模塊流程圖</p><p><b> 圖2-2</b></p><p> 2.4.2 客戶端功能模塊流程圖</p><p><b> 圖2-3</b><
29、/p><p><b> 三 詳細設(shè)計</b></p><p> 3.1系統(tǒng)體系協(xié)議設(shè)計</p><p> 3.2聊天室服務(wù)器端設(shè)計</p><p> 服務(wù)器包server主要包含兩個類,分為ChatServer 和ClientProc</p><p> 3.2.1 ChatServer類&l
30、t;/p><p> 該類包含了服務(wù)器的主要功能的實現(xiàn):建立服務(wù)器連接,實現(xiàn)服務(wù)端用戶登錄、</p><p> 退出與監(jiān)聽,實現(xiàn)服務(wù)器端的消息收發(fā),在線用戶列表實現(xiàn)等主要功能。</p><p> 它的主要結(jié)構(gòu)如下所示:</p><p><b> 圖3-1 </b></p><p> 3.2.2
31、 ClientProc類</p><p> 該類的功能是為某個用戶服務(wù)的建立一個用戶線程。</p><p> 主要的實現(xiàn)代碼如下:</p><p> private void updateList(String name, String sex) {</p><p> System.out.println("in two u
32、pdatelist");</p><p> ss.cl.remove(name);</p><p> ss.resetcl();</p><p> Ss.resetplist();</p><p><b> }</b></p><p> public void run() {&
33、lt;/p><p> while (name == null) {</p><p><b> try {</b></p><p> String inmsg;</p><p> inmsg = in.readLine();</p><p> System.out.println(inmsg)
34、;</p><p> String[] userInfo;</p><p> userInfo = inmsg.split("&");</p><p> name = userInfo[0];</p><p> sex = userInfo[1];</p><p> ss.addC
35、onnection(s, this);</p><p> if (ss.cl.contains(userInfo[0])) {// 判斷是否重名</p><p> System.out.println("有重名錯誤");</p><p> ss.sendERRO(name, "samename");</p>
36、<p> ss.deleteConnection(s, this, 1);</p><p> s.close();</p><p><b> return;</b></p><p><b> } else {</b></p><p> ss.sendOne(name, &quo
37、t;nosamename");</p><p> System.out.println("沒有重名錯誤!?。。。。。。?!");</p><p> System.out.println("已將此用戶記錄");</p><p> ss.sendAll("new&" + inmsg); /
38、/ 發(fā)送信息更新用戶列表 new & name & sex</p><p> System.out.println("已向所有用戶發(fā)送" + name);</p><p> ss.cl.add(name);</p><p> System.out.println("用戶列表:" + ss.cl);<
39、/p><p> ss.resetcl();</p><p> ss.resetplist();</p><p> Date t = new Date();</p><p> ss.jTextArea1.append(t.toString() + ":"</p><p> + s.getInet
40、Address() + " " + s.getPort() + " "</p><p> + name + "登入" + "\n");</p><p> ss.flashlist();</p><p> System.out.println("flashlist has
41、run");</p><p><b> }</b></p><p> } catch (IOException ee) {</p><p> ee.printStackTrace();</p><p><b> }</b></p><p><b>
42、 }</b></p><p> while (true) {</p><p> System.out.println("該用戶線程開始監(jiān)聽信息");</p><p><b> try {</b></p><p> String line = in.readLine();</
43、p><p> System.out.println(line);</p><p> if (line.equals("quit"))// 處理退出事件(讀取信息)</p><p><b> {</b></p><p> ss.sendAll("【系統(tǒng)消息】 " + this.n
44、ame + " 退出了聊天室");</p><p> ss.deleteConnection(s, this);</p><p> this.updateList(this.name, this.sex);</p><p> s.close();</p><p><b> return;</b>
45、;</p><p> } else// 一般消息,又可以分為幾種,對大家說, 與某個人交談,傳輸文件信息或者私聊</p><p><b> {</b></p><p> String[] inmsg = line.split("&");</p><p> if (inmsg[0].co
46、mpareTo("cancelsendfile") == 0) {// 取消文件發(fā)送消息</p><p> ss.sendOne(inmsg[1], "cancelsendfile" + "&" + this.name);</p><p> } else if (inmsg[0].compareTo("sen
47、dfile") == 0)// 發(fā)送文件消息</p><p><b> {</b></p><p> ss.sendOne(inmsg[1], "sendfile" + "&" + this.name + "&"</p><p> + inmsg[2]
48、+ "&" + inmsg[3] + "&" + inmsg[4]</p><p> + "&" + inmsg[5]);</p><p> } else if (inmsg[0].compareTo("acceptfile") == 0)// 接收文件消息</p>&
49、lt;p><b> {</b></p><p> ss.sendOne(inmsg[1], inmsg[0] + "&" + this.name);</p><p> } else if (inmsg[0].compareTo("refusefile") == 0)// 拒絕接收文件消息</p>
50、<p><b> {</b></p><p> ss.sendOne(inmsg[1], inmsg[0] + "&" + this.name);</p><p> } else if (!line.startsWith("withWho")) { // 對所有人說</p><p&g
51、t; ss.sendAll(this.name + ": " + line);</p><p><b> }</b></p><p> else if (inmsg[1].equals("privateTure")) {</p><p> if (!(ss.sendOne(inmsg[2], &q
52、uot;privateTalk" + "&" + name</p><p> + "&" + inmsg[2] + "&" + inmsg[3]))) { // 私聊不成功發(fā)送成功</p><p> out.println(inmsg[2] + "已經(jīng)離開聊天室");<
53、;/p><p> out.flush();</p><p><b> }</b></p><p> } else {// 發(fā)給所有的人</p><p> ss.sendAll("withWho" + "&" + name + "&" + in
54、msg[2]</p><p> + "&" + inmsg[3]);</p><p><b> }</b></p><p><b> }</b></p><p> } catch (IOException e) {</p><p> Sy
55、stem.out.println(e.toString());</p><p><b> try {</b></p><p> s.close();</p><p> } catch (IOException e2) {</p><p><b> }</b></p><p
56、><b> return;</b></p><p><b> }</b></p><p><b> }</b></p><p><b> }</b></p><p> 3.3聊天室客戶端設(shè)計</p><p> 聊天
57、室包chat主要包含五個類,分為ChatFrame 、Connect、Plist、PopupListener和Acceptfilethread&Sendfilethread。</p><p> 3.3.1 ChatFrame類</p><p> 該類是聊天室主要功能類,其中包括了聊天室界面設(shè)計,群聊私聊等功能的實現(xiàn)。</p><p> 其中數(shù)據(jù)包分析功
58、能的主要代碼如下:</p><p><b> try {</b></p><p> if ((inmsg = in.readLine()) != null) {</p><p> if (inmsg.startsWith("samename")) {</p><p> } else if (i
59、nmsg.startsWith("somequit")) {</p><p> String[] userInfo = inmsg.split("&");</p><p> plist.listModel.removeElement(userInfo[1] + " 〖"</p><p> +
60、userInfo[2] + "〗");</p><p> } else if (inmsg.startsWith("new"))// 接收服務(wù)器發(fā)送的更新用戶列表信息</p><p><b> {</b></p><p> System.out.println(inmsg + "
61、new");</p><p> String[] userInfo = inmsg.split("&");</p><p> if (userInfo[1].equals(myName))</p><p> insert(commonArea, "您" + "上線了");</p
62、><p><b> else</b></p><p> insert(commonArea, userInfo[1] + "上線了");</p><p> } else if (inmsg.startsWith("resetselect")) {</p><p> System
63、.out.println(inmsg + " new");</p><p> String[] userInfo = inmsg.split("&");</p><p> perponsComboBox.removeAllItems();</p><p> perponsComboBox.addItem(
64、"所有人");</p><p> for (int i = 1; i < userInfo.length; i++) {</p><p> if (!(myName.equals(userInfo[i]))) {</p><p> perponsComboBox.addItem(userInfo[i]);</p><
65、;p><b> }</b></p><p><b> }</b></p><p> } else if (inmsg.startsWith("resetplist")) {</p><p> System.out.println(inmsg + " new");
66、</p><p> String[] userInfo = inmsg.split("&");</p><p> String[] cname;</p><p> plist.listModel.removeAllElements();</p><p> for (int i = 1; i < use
67、rInfo.length; i++) {</p><p> System.out.println(userInfo[i] + " " + myName);</p><p> cname = userInfo[i].split(" 〖");</p><p> if (!(cname[0].equals(myName)))
68、 {</p><p> plist.listModel.addElement(userInfo[i]);</p><p><b> }</b></p><p><b> }</b></p><p> } else if (inmsg != null)// 一般消息</p>&l
69、t;p><b> {</b></p><p> String[] sendfile = inmsg.split("&");</p><p> if (sendfile[0].compareTo("cancelsendfile") == 0) {</p><p> insert(myM
70、sgArea, sendfile[1] + "取消了文件發(fā)送");</p><p> acceptboolean = false;</p><p> this.acceptfile.setEnabled(true);</p><p> this.acceptfileArea.setText("");</p>
71、<p> } else if (sendfile[0].compareTo("sendfile") == 0) {</p><p> this.acceptfileArea.setText(sendfile[2]);</p><p> insert(myMsgArea, sendfile[1] + " 發(fā)來文件");</p&g
72、t;<p> filemsg = inmsg;</p><p> } else if (sendfile[0].compareTo("acceptfile") == 0) {</p><p> insert(myMsgArea, sendfile[1] + " 接收了你發(fā)的文件");</p><p> }
73、 else if (sendfile[0].compareTo("refusefile") == 0) {</p><p> insert(myMsgArea, sendfile[1] + " 拒絕了你發(fā)的文件");</p><p> sendboolean = false;</p><p> this.sendfile
74、.setEnabled(true);</p><p> this.sendfileArea.setText("");</p><p> } else if (sendfile[0].compareTo("withWho") == 0) {</p><p> if (sendfile[2].equals(myName))/
75、/ 如果是發(fā)給自己的消息</p><p><b> {</b></p><p> insert(commonArea, sendfile[1] + "對『您』說:"</p><p> + sendfile[3]);</p><p> } else if (sendfile[1].equals(
76、myName)) {</p><p> insert(commonArea, "您對『" + sendfile[2] + "』說:"</p><p> + sendfile[3]);</p><p><b> } else {</b></p><p> insert(com
77、monArea, sendfile[1] + "對『"</p><p> + sendfile[2] + "』說:" + sendfile[3]);</p><p><b> }</b></p><p> } else if (inmsg.startsWith("privateTalk&q
78、uot;)) {</p><p> String showmsg[] = inmsg.split("&");</p><p> insert(myMsgArea, "『" + showmsg[1] + "』密您說: "</p><p> + showmsg[3]);</p>&l
79、t;p><b> } else {</b></p><p> insert(commonArea, inmsg);</p><p><b> }</b></p><p><b> }</b></p><p> 3.3.2 Connect類</p>
80、<p> 該類是實現(xiàn)聊天室登錄窗口的類,包括登錄聊天室的用戶和接入服務(wù)器地址端口等信息的提交功能。</p><p> 其中與服務(wù)器連接功能的主要代碼如下:</p><p> public void link() throws Exception { // 連接服務(wù)器</p><p> hostName = hostText.getText().tr
81、im();</p><p> port = Integer.parseInt(portText.getText());</p><p> client = new Socket(hostName, port);// 創(chuàng)建一個流套接字并將其連接到指定 IP 地址的指定端口號。</p><p> in = new BufferedReader(new InputS
82、treamReader(client.getInputStream()));</p><p> out = new PrintWriter(client.getOutputStream());</p><p> String s = client.getInetAddress().toString();</p><p> String[] Info = s.s
83、plit("/");</p><p> out.println(nameText.getText() + "&" + sex); // "&"+</p><p> // Info[1]);//向服務(wù)器發(fā)送用戶信息</p><p> out.flush();</p><
84、;p><b> }</b></p><p> 3.3.3 Plist類</p><p> 該類是顯示進入聊天室的人名單,實時提供給各位用戶其他的在線用戶列表。</p><p> 3.3.4 PopupListener類</p><p> 該類實現(xiàn)了在空白聊天區(qū)右擊監(jiān)聽并顯示下拉菜單內(nèi)容的功能。</p
85、><p> 3.3.5 Acceptfilethread&Sendfilethread類</p><p> 該類實現(xiàn)了點對點之間的即時文件傳輸功能。下面展示的是接收文件的主要功能代碼。</p><p> 接收文件功能的主要實現(xiàn)流程:</p><p> if (e.getSource() == acceptfile)// 接收文件傳
86、輸按鈕</p><p><b> {</b></p><p> if (this.acceptfileArea.getText().length() == 0) {</p><p> this.insert(myMsgArea, "沒有文件需要接受");</p><p><b> }
87、 else {</b></p><p> String[] acpfile = filemsg.split("&");</p><p> out.println("acceptfile" + "&" + acpfile[1]);</p><p> out.flush();&
88、lt;/p><p> acceptthread = new acceptfilethread(this);</p><p> acceptboolean = true;</p><p> String filepath = null;</p><p> String sourcepath = acceptfileArea.getText(
89、);</p><p> System.out.println(sourcepath);</p><p> int dd = sourcepath.lastIndexOf("\\");</p><p> String fname = sourcepath.substring(dd + 1);</p><p> int
90、 loc = fname.indexOf(".");</p><p> String ftype = null;</p><p> if (loc != -1)</p><p> ftype = fname.substring(loc);</p><p> JFileChooser jfc = new JFileC
91、hooser();// 可加彈出框選擇路徑</p><p> int result = jfc.showSaveDialog(this);</p><p> File file = null;</p><p> if (result == JFileChooser.APPROVE_OPTION) {</p><p> file = j
92、fc.getSelectedFile();</p><p><b> }</b></p><p> if (ftype != null) {</p><p> filepath = file.getPath() + ftype;</p><p> System.out.println(filepath);<
93、/p><p><b> } else</b></p><p> filepath = file.getPath();</p><p> acceptthread.ipport(acpfile[3], (Integer.parseInt(acpfile[4])),</p><p> filepath);</p&g
94、t;<p> acceptfile.setEnabled(false);// 防止重復(fù)點接收</p><p> acceptthread.start();// 開始接收</p><p><b> }</b></p><p><b> }</b></p><p> 四 系統(tǒng)實現(xiàn)
95、與調(diào)試分析</p><p> 調(diào)試是程序設(shè)計中最重要的一環(huán),它幾乎決定了程序優(yōu)劣和一個項目是否完成的關(guān)鍵。下面是我們小組對程序進行的調(diào)試成果:</p><p> 4.1聊天室服務(wù)器運行效果</p><p> 服務(wù)器主界面運行展示:</p><p><b> 圖4-1</b></p><p>
96、; 4.2聊天室客戶端用例運行效果</p><p> 聊天室主界面運行展示:</p><p><b> 圖4-2</b></p><p> 私聊消息運行界面展示:</p><p><b> 圖4-3</b></p><p> 文件發(fā)送選擇界面展示:</p&g
97、t;<p><b> 圖4-4</b></p><p><b> 文件接受情況展示:</b></p><p><b> 圖4-5</b></p><p> 4.3結(jié)果分析與問題解決</p><p> 經(jīng)過我們小組努力運行測試之后,該程序能基本實現(xiàn)設(shè)計要求
98、中所需實現(xiàn)的各項基本功能,程序經(jīng)過不斷調(diào)試與修改之后能夠在本機與局域網(wǎng)之間完美的運行,并且沒有出現(xiàn)什么明顯的錯誤。在實驗過程中,我們主要遇到了以下幾個問題:</p><p> 用戶名重復(fù)的問題。在測試時,我們發(fā)現(xiàn)了設(shè)計時的這個遺漏之處,通過在用戶線程建立的時候,增加了一個用戶名判斷機制,并且根據(jù)結(jié)果發(fā)送信息,如果有重名則發(fā)送samename 到connection類,并且反饋重名警告信息;若無重名則發(fā)送none
99、name 并進入客戶端界面。</p><p> 用戶列表中顯示自己的問題。為了讓在線好友下拉選擇菜單中不顯示自己的ID,我們設(shè)計了在當用戶接受到列表信息之后添加到下拉菜單中時增加一個判斷,開始用java中String類的StartsWith方法會出現(xiàn)無法添加用戶名前綴雷同的ID的bug,后來改用equarls之后解決這個異常情況。</p><p> 收發(fā)文件的問題。開始的時候我們接收文
100、件時需要自己定義文件類型,經(jīng)過修改之后,我們可以在接受時只需要輸入文件名即可,文件格式默認發(fā)送方的文件格式。實現(xiàn)代碼如下:</p><p> int dd = sourcepath.lastIndexOf("\\");</p><p> String fname = sourcepath.substring(dd + 1);</p><p>
101、 int loc = fname.indexOf(".");</p><p> String ftype = null;</p><p> if (loc != -1)</p><p> ftype = fname.substring(loc);</p><p> JFileChooser jfc = new J
102、FileChooser();// 可加彈出框選擇保存路徑</p><p> int result = jfc.showSaveDialog(this);</p><p> File file = null;</p><p> if (result == JFileChooser.APPROVE_OPTION) {</p><p> f
103、ile = jfc.getSelectedFile();</p><p><b> }</b></p><p> if (ftype != null) {</p><p> filepath = file.getPath() + ftype;</p><p> System.out.println(filepat
104、h);</p><p><b> } else</b></p><p> filepath = file.getPath();</p><p><b> 五 總 結(jié)</b></p><p> 通過了本次課程設(shè)計,我們的邏輯思維能力有了一次很大的提升,它不僅加強了我們的系統(tǒng)思考問題的能力,而且
105、還改變了我們以前不好的編程習(xí)慣,雖然花費了不少的時間,但是我們學(xué)到了豐富的知識。在程序編寫中,我們用到了JAVA中的Swing組件,面板容器,事件處理,線程的創(chuàng)建、同步,輸入輸出處理,內(nèi)部類,異常處理和網(wǎng)絡(luò)通信的知識,這對于我們的所學(xué)到的知識是一次相當好的實踐,讓我們更加鞏固了這方面的知識。在這次的課程設(shè)計中,我們也用到了Socket 類和ServerSocket類,明白了它們是Java實現(xiàn)Socket通信的主要工具。</p>
106、;<p> 同時,我對面向?qū)ο蟮幕舅枷胗辛诉M一步的理解,對一次實驗的各個階段的任務(wù)也有了一定的了解。首先,做一個項目,我們必須先考慮好設(shè)計目的與做好需求分析;然后對聊天室系統(tǒng)的架構(gòu)進行總體設(shè)計,詳細設(shè)計;接著我們再使用開發(fā)工具實現(xiàn)我們的思想;最后進行調(diào)試與總結(jié)。通過這次設(shè)計,使我們認識到體系的架構(gòu)是最重要的,只有準確的系統(tǒng)設(shè)計、很好的定義各個模塊及模塊之間的關(guān)系,才能在編碼階段更輕松的實現(xiàn),最終完成一個項目工作。<
107、;/p><p> 在設(shè)計的過程中,我們會遇到重重困難,但是經(jīng)過大家的努力學(xué)習(xí)與探討,我們一一克服了這些問題。這次的課程設(shè)計讓我們了解到了自己在這些知識上的一些不足,同時也幫我們更加牢固地掌握了這些方面的知識,達到學(xué)以致用。</p><p> 最后,我要感謝重大計算機學(xué)院的老師們,為我們開設(shè)了這樣一門符合我們專業(yè)的實踐性如此強的課程。這不斷讓我們將學(xué)到的理論知識付諸實踐,更是擴展了我們的專業(yè)
108、能力,我們受益匪淺。</p><p><b> 參考文獻</b></p><p> 1.《計算機網(wǎng)絡(luò)》第4版 謝希仁 電子工業(yè)出版社 2003年.6月</p><p> 2.用TCP/IP進行網(wǎng)絡(luò)互聯(lián) D.E.Comer 電子工業(yè)出版社2004.11第四版</p><
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- web課程設(shè)計—— 聊天室
- vc++課程設(shè)計--聊天室程序設(shè)計
- mfc課程設(shè)計報告---聊天室程序設(shè)計
- java課程設(shè)計--聊天室系統(tǒng)
- java網(wǎng)絡(luò)聊天室課程設(shè)計
- java課程設(shè)計---聊天室系統(tǒng)
- tcp課程設(shè)計--網(wǎng)絡(luò)聊天室
- 網(wǎng)絡(luò)編程課程設(shè)計-簡單的聊天室程序設(shè)計
- 網(wǎng)絡(luò)編程課程設(shè)計-簡單的聊天室程序設(shè)計
- jsp課程設(shè)計報告--在線聊天室
- java課程設(shè)計之簡單聊天室
- 網(wǎng)絡(luò)編程課程設(shè)計---網(wǎng)絡(luò)聊天室
- 《web開發(fā)》課程設(shè)計報告--聊天室
- 網(wǎng)絡(luò)編程課程設(shè)計-java聊天室
- java課程設(shè)計報告---利用java實現(xiàn)簡單聊天室
- 軟件課程設(shè)計報告---簡易網(wǎng)絡(luò)聊天室
- 軟件工程課程設(shè)計--- 文本聊天室
- java聊天室設(shè)計
- 基于java的聊天室程序設(shè)計
- java聊天室的設(shè)計與實現(xiàn)
評論
0/150
提交評論