大三下tcp ip技術(shù)第11章_第1頁
大三下tcp ip技術(shù)第11章_第2頁
大三下tcp ip技術(shù)第11章_第3頁
大三下tcp ip技術(shù)第11章_第4頁
大三下tcp ip技術(shù)第11章_第5頁
已閱讀5頁,還剩33頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、第1頁 第11章 網(wǎng)絡(luò)編程綜合實例第2頁聊天軟件編寫Step 1確定程序功能好友管理:通過聊天窗口,可以添加新的好友;聊天:最基本功能??梢园严鹘o好友;聊天記錄:可以查看好友的聊天記錄。第3頁聊天軟件編寫首先來看一下最終軟件的界面。第4頁聊天軟件編寫上述窗口可以分為如下幾個部分左上:該部分是聊天記錄框。里面有你和朋友聊天的通話記錄;左下:該部分是輸入框。是你將要發(fā)出的通話內(nèi)容;右上:該部分是好友列表。里面有你存儲的好友名單;標題欄顯示自己的昵稱,通信的端口以及聊天的對象。第5頁聊天軟件編寫此聊天窗口程序具有3個主要的功能模塊:UDP消息收發(fā)模塊:負責接收和發(fā)送UDP消息;消息處理模塊:負責

2、處理UDP消息模塊所接收或發(fā)生的信息;圖形界面模塊:負責圖形用戶界面,處理用戶界面事件。第6頁聊天軟件編寫兩種宏觀思路第一種思路把所有模塊代碼寫在一個class里面。執(zhí)行到哪一步就創(chuàng)建哪一步的對象;缺點程序很繁雜;大量代碼會被重復使用。第7頁聊天軟件編寫第二種思路把各個模塊分開編寫代碼,然后通過接口把獨立的模塊互連起來。優(yōu)點代碼執(zhí)行效率高;程序結(jié)構(gòu)清晰;糾錯針對性強。第8頁聊天軟件編寫對于上述3個模塊,我們可以使用以下兩個接口來完成模塊間的相互聯(lián)系。MessageHandler接口import .SocketAddress;public interface MessageHandler voi

3、d handleMessage(byte data, SocketAddress addr);/處理消息的方法第9頁聊天軟件編寫MessageHandler接口代表的是消息處理模塊的接口。其中只有一個handleMessage()方法,用途是處理UDP消息收發(fā)模塊接收到的消息。參數(shù)1表示收到的數(shù)據(jù);參數(shù)2表示該消息從哪個Socket地址傳過來。第10頁聊天軟件編寫Messenger接口import .SocketAddress;public interface Messenger public void setMessageHandler(MessageHandler handler);/設(shè)置

4、消息處理器public void sendData(byte data, SocketAddress addr);/發(fā)送數(shù)據(jù)public void startMessenger();/啟動消息模塊第11頁聊天軟件編寫Messenger接口代表UDP消息收發(fā)模塊。其中定義了三個方法:setMessageHandler設(shè)置消息處理器方法,參數(shù)就是MessageHandler接口。其作用是為UDP消息收發(fā)模塊設(shè)置一個處理消息的類UDP消息收發(fā)模塊本身并不知道如何處理數(shù)據(jù),當UDP消息收發(fā)模塊收到一個消息后,就調(diào)用MessageHandler接口中的handleMessage()方法來具體處理數(shù)據(jù)。第

5、12頁聊天軟件編寫sendData該方法用以發(fā)送數(shù)據(jù)。消息處理模塊和圖形界面模塊均使用該方法來發(fā)送UDP消息我們把程序中所有消息都交給UDP消息發(fā)送模塊統(tǒng)一發(fā)送。第13頁聊天軟件編寫startMessenger該方法用于啟動UDP消息處理模塊。這里面有兩個線程:一個負責發(fā)送消息,另一個負責接收。UDP協(xié)議在接收消息時,若消息沒有發(fā)送過來,則DatagramSocket中的receive()方法會阻塞。同樣,發(fā)送時也需要一定的時間。故我們必須用兩個線程。否則就沖突了。第14頁聊天軟件編寫通過MessageHandler接口和setMessageHandler()方法,我們就可以把消息處理模塊和消

6、息收發(fā)模塊分開讓他們通過MessageHandler接口聯(lián)系就可以了。圖形界面模塊消息處理模塊UDP消息收發(fā)模塊更新用戶界面?zhèn)鬟f收到的消息數(shù)據(jù)發(fā)送數(shù)據(jù)第15頁聊天軟件編寫設(shè)計程序思路要根據(jù)程序的具體功能,把程序分割成不同的模塊;優(yōu)先考慮使用接口這一工具來把不同模塊聯(lián)系起來。第16頁聊天軟件編寫我們先來看一下最終程序運行后的結(jié)果。開始執(zhí)行程序時,出現(xiàn)如下界面。第17頁聊天軟件編寫對輸入用戶名和端口號有如下要求:要求用戶名中不能包括“#”字符;要求端口號必須是數(shù)字;要求端口號的范圍為065535.第18頁聊天軟件編寫正確輸入用戶名和端口號后,出現(xiàn)主窗口。當還沒有添加好友就開始發(fā)送數(shù)據(jù)時,出現(xiàn)如下錯

7、誤信息。第19頁聊天軟件編寫我們添加好友時,需要填寫好友的IP地址和端口號。具體如下圖所示。第20頁聊天軟件編寫具體通話效果如下圖所示。第21頁聊天軟件編寫第一部分UDP消息收發(fā)模塊 UDP消息收發(fā)模塊不僅需要處理UDP消息,還需要通過消息隊列來避免不必要的線程阻塞。下面會具體介紹一下相關(guān)類和方法。第22頁聊天軟件編寫UDP消息收發(fā)模塊的實現(xiàn)所謂實現(xiàn)就是讓一個類實現(xiàn)前面介紹的Messenger接口。我們通過類UDPMessager來實現(xiàn)該接口。對接口中三個抽象方法,setMessageHandler只是設(shè)置一個參數(shù)變量。我們重點介紹對sendData()方法和startMessenger()方

8、法的使用。第23頁聊天軟件編寫UDPMessager類對于發(fā)送消息使用了一個消息列表。每次發(fā)送消息時,把消息封裝成一個DatagramPacket對象,然后放入列表。public void sendData(byte data, SocketAddress addr) /實現(xiàn)抽象方法 synchronized (messageList) /同步,避免訪問沖突 DatagramPacket msg=null; msg= new DatagramPacket (data, data.length);/封裝消息 msg.setSocketAddress(addr); messageList.add(

9、msg);/將消息加入列表 messageList.notify();/喚醒發(fā)送線程 第24頁聊天軟件編寫在sendData()方法中,把消息封裝在DatagramPacket對象中,然后把這個對象放入messageList(ArrayList)中,然后喚醒等待在messageList上的線程。第25頁聊天軟件編寫實現(xiàn)startMessenger()方法public void startMessenger () Thread recvThread = new Thread (new MessageReceiver();/創(chuàng)建消息接收線程 recvThread.start(); Thread s

10、endThread = new Thread(new MessageSender ();/創(chuàng)建消息發(fā)送線程 sendThread.start();第26頁聊天軟件編寫我們通過兩個實現(xiàn)了Runnable接口的內(nèi)部類來接收/發(fā)送消息。MessageReceiver類MessageSender類第27頁聊天軟件編寫我們需要注意在MessageSender內(nèi)部類中所調(diào)用的getData()方法。該方法在messageList上同步并且在其上等待(沒有消息時):messageList.wait()。喚醒該線程的地方就是在sendData()方法中的messageList.notify()每當有消息過來,

11、就會喚醒一次線程以保證消息正確發(fā)送。第28頁聊天軟件編寫2. 消息列表的使用我們使用消息列表messageList就是為了避免阻塞現(xiàn)象的產(chǎn)生。從而保證程序正確運行。Swing線程圖形用戶界面模塊messageList消息發(fā)送線程UDP消息收發(fā)模塊添加消息取出消息第29頁聊天軟件編寫第二部分圖形用戶界面模塊該部分內(nèi)容簡單,但是代碼比較多。主要就是安排界面的格式、結(jié)構(gòu)和一些視覺化的要素。1. 程序中用到一些新的組件,需要做一下介紹。第30頁聊天軟件編寫JDialog表示對話框。不能單獨存在,需依賴于一個窗口。JList表示一個列表。聊天軟件中那個好友列表就是用它來表示的。JList中有一個事件Li

12、stSelection,當用戶選擇列表中不同表項時,就會觸發(fā)這個事件。JOptionPane是一個工具類??梢苑奖愕膹棾龈鞣N提示對話框。軟件中的錯誤提示就是用它做的。第31頁聊天軟件編寫2. 聊天窗口相關(guān)的類聊天窗口用到兩個類:InputMessageDialog類就是用于多行輸入的對話框,繼承自JDialog類。ChatUtils類該類主要提供一些常用的靜態(tài)方法。第32頁聊天軟件編寫3. InputMessageDialog類該類在程序中會用到兩次。第一次就是開始時用戶名和端口號的對話框;第二此就是添加好友的對話框。該類接收一個二維String數(shù)組作為參數(shù)(構(gòu)造方法里接收)。其中第二維必須有

13、兩個元素,第一個是對話框上的標簽文字,第二個是對應(yīng)的默認值。String initValue = new String 用戶名:, Alex , 端口:, 7777 ;第33頁聊天軟件編寫4. ChatUtils類該類是一個工具類,為3個模塊服務(wù),含有如下幾個主要方法:屬性SEPARATOR:消息分隔符。該分隔符是把消息中的用戶名和消息內(nèi)容分開。值為“#”。故這也是為何用戶名不能包含“#”的原因;buildMessage():該方法用以把用戶名、消息內(nèi)容及分隔符一起構(gòu)建成一個byte數(shù)組作為發(fā)送的內(nèi)容。第34頁聊天軟件編寫5. ChatFrame類該類是最復雜的一個類。凡是設(shè)計Swing圖形界

14、面的類都會有大量的代碼。在ChatFrame類中包含有一個UserModel類。該類使用來描述好友的。 UserModel類的對象被使用在JList中。其包含3個屬性:name:String類型,值為好友名稱;addr:SocketAddress類型,值為好友的地址和端口號;messageHistory:StringBuffer類型,值為聊天記錄。第35頁聊天軟件編寫parseMessage():根據(jù)一個byte數(shù)組和相應(yīng)的分隔符,解析出用戶名和消息內(nèi)容。該方法要和buildMessage()方法配套使用;locateFrameCenter()& locateDialogCenter():作用是把窗口或?qū)υ捒虻某跏嘉恢迷O(shè)為中央;createSocketAddrFromeStr():用以構(gòu)建InetSocketAddress的實例,來發(fā)送信息。第36頁聊天軟件編寫第三部分消息處理模塊ChatFrame類實現(xiàn)了MessageHandler接口,扮演了程序中消息處理

溫馨提示

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

評論

0/150

提交評論