2023年全國(guó)碩士研究生考試考研英語(yǔ)一試題真題(含答案詳解+作文范文)_第1頁(yè)
已閱讀1頁(yè),還剩21頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、<p>  課 程 設(shè) 計(jì)</p><p><b>  資 料 袋</b></p><p>  學(xué)生姓名 專業(yè)班級(jí) 網(wǎng)絡(luò)工程 學(xué)號(hào) </p><p>  題 目 基于UDP協(xié)議網(wǎng)

2、上聊天程序 </p><p>  成 績(jī) 起止日期 2013 年 11 月 25 日~ 2013 年 12 月 13 日</p><p>  目 錄 清 單</p><p><

3、;b>  課程設(shè)計(jì)任務(wù)書(shū)</b></p><p>  2013 —2014學(xué)年 第 1 學(xué)期</p><p>  完成期限:自 2013 年 11 月 25 日至 2013 年 12 月 13 日 共 3 周</p><p>  指導(dǎo)教師(簽字):

4、 年 月 日</p><p>  系(教研室)主任(簽字): 年 月 日</p><p><b>  目錄</b></p><p>  1 課程設(shè)計(jì)簡(jiǎn)介4</p><p>  1.1 課程設(shè)計(jì)的目的

5、4</p><p>  1.2 課程設(shè)計(jì)內(nèi)容4</p><p>  2課程設(shè)計(jì)實(shí)現(xiàn)過(guò)程5</p><p>  2.1 協(xié)議原理5</p><p>  2.2 客戶機(jī)/服務(wù)器模式7</p><p>  2.3 關(guān)鍵技術(shù)8</p><p>  2.4 流程圖10</p>&

6、lt;p>  2.5 系統(tǒng)結(jié)構(gòu)圖11</p><p>  2.6 程序調(diào)試及界面效果圖11</p><p>  2.7 源代碼15</p><p><b>  3設(shè)計(jì)總結(jié)22</b></p><p><b>  4參考文獻(xiàn)23</b></p><p><

7、b>  1 課程設(shè)計(jì)簡(jiǎn)介</b></p><p>  1.1 課程設(shè)計(jì)的目的 </p><p>  開(kāi)發(fā)一個(gè)專用于實(shí)現(xiàn)兩臺(tái)計(jì)算機(jī)之間即時(shí)通訊的軟件,以方便兩臺(tái)或兩臺(tái)以上的計(jì)算機(jī)之間信息的交流。,在連接并通信時(shí),尤其是近程的即時(shí)通訊,徹底的脫離了遠(yuǎn)程的服務(wù)器,避免了和遠(yuǎn)程服務(wù)器連接時(shí)過(guò)多的浪費(fèi)網(wǎng)絡(luò)資源。并且避免了服務(wù)器忙或與服務(wù)器無(wú)法連接時(shí),浪費(fèi)過(guò)多時(shí)間用于和服務(wù)器建立連接

8、!因此,這個(gè)軟件是極具適應(yīng)性和實(shí)用性的即時(shí)通訊軟件!本次課程設(shè)計(jì)的目的是學(xué)習(xí)基于UDP協(xié)議實(shí)現(xiàn)網(wǎng)絡(luò)聊天程序,已達(dá)到學(xué)會(huì)面向無(wú)連接方式的程序設(shè)計(jì)方法,并理解網(wǎng)絡(luò)編程中面向無(wú)連接的概念。</p><p>  1.2 課程設(shè)計(jì)內(nèi)容</p><p>  1.實(shí)現(xiàn)一個(gè)基于UDP協(xié)議的簡(jiǎn)單的聊天程序,包括服務(wù)器和客戶端。</p><p><b>  2.支持多人聊天。

9、</b></p><p>  3.客戶端具有圖形化用戶界面。</p><p><b>  2課程設(shè)計(jì)實(shí)現(xiàn)過(guò)程</b></p><p><b>  2.1 協(xié)議原理</b></p><p>  UDP協(xié)議的全稱是用戶數(shù)據(jù)報(bào)協(xié)議,在網(wǎng)絡(luò)中它與TCP協(xié)議一樣用于處理數(shù)據(jù)包,是一種無(wú)連接的協(xié)議。

10、在OSI模型中,在第四層——傳輸層,處于IP協(xié)議的上一層。UDP有不提供數(shù)據(jù)包分組、組裝和不能對(duì)數(shù)據(jù)包進(jìn)行排序的缺點(diǎn),也就是說(shuō),當(dāng)報(bào)文發(fā)送之后,是無(wú)法得知其是否安全完整到達(dá)的。UDP用來(lái)支持那些需要在計(jì)算機(jī)之間傳輸數(shù)據(jù)的網(wǎng)絡(luò)應(yīng)用。包括網(wǎng)絡(luò)視頻會(huì)議系統(tǒng)在內(nèi)的眾多的客戶/服務(wù)器模式的網(wǎng)絡(luò)應(yīng)用都需要使用UDP協(xié)議。UDP協(xié)議從問(wèn)世至今已經(jīng)被使用了很多年,雖然其最初的光彩已經(jīng)被一些類似協(xié)議所掩蓋,但是即使是在今天UDP仍然不失為一項(xiàng)非常實(shí)用和可

11、行的網(wǎng)絡(luò)傳輸層協(xié)議。</p><p>  UDP是OSI參考模型中一種無(wú)連接的傳輸層協(xié)議,它主要用于不要求分組順序到達(dá)的傳輸中,分組傳輸順序的檢查與排序由應(yīng)用層完成,提供面向事務(wù)的簡(jiǎn)單不可靠信息傳送服務(wù)。UDP 協(xié)議基本上是IP協(xié)議與上層協(xié)議的接口。UDP協(xié)議適用端口分別運(yùn)行在同一臺(tái)設(shè)備上的多個(gè)應(yīng)用程序。</p><p>  與所熟知的TCP(傳輸控制協(xié)議)協(xié)議一樣,UDP協(xié)議直接位于IP

12、(網(wǎng)際協(xié)議)協(xié)議的頂層。根據(jù)OSI(開(kāi)放系統(tǒng)互連)參考模型,UDP和TCP都屬于傳輸層協(xié)議。</p><p>  UDP協(xié)議的主要作用是將網(wǎng)絡(luò)數(shù)據(jù)流量壓縮成數(shù)據(jù)包的形式。一個(gè)典型的數(shù)據(jù)包就是一個(gè)二進(jìn)制數(shù)據(jù)的傳輸單位。每一個(gè)數(shù)據(jù)包的前8個(gè)字節(jié)用來(lái)包含報(bào)頭信息,剩余字節(jié)則用來(lái)包含具體的傳輸數(shù)據(jù)。</p><p>  UDP是無(wú)連接的,即發(fā)送數(shù)據(jù)之前不需要建立連接(當(dāng)然發(fā)送數(shù)據(jù)結(jié)束時(shí)也沒(méi)有連接可

13、釋放)因此減少了開(kāi)銷和發(fā)送數(shù)據(jù)之前的時(shí)延。</p><p>  UDP使用的是盡最大努力交付,即不保證可靠交付,因此主機(jī)不需要維持復(fù)雜的連接狀態(tài)表。</p><p>  UDP是面向報(bào)文的。發(fā)送方的UDP對(duì)應(yīng)程序交下來(lái)的報(bào)文,在添加首部后就向下交付給IP層。UDP對(duì)應(yīng)用層交下來(lái)的報(bào)文,既不合并,也不拆分,而是保留這些報(bào)文的邊界。</p><p>  UDP是定義用來(lái)

14、在互連網(wǎng)絡(luò)環(huán)境中提供數(shù)據(jù)報(bào)交換的計(jì)算機(jī)通信的協(xié)議。此協(xié)議默認(rèn)是IP下層協(xié)議。此協(xié)議提供了向另一用戶程序發(fā)送信息的最簡(jiǎn)便的協(xié)議機(jī)制,不需要連接確認(rèn)和保護(hù)復(fù)制,所以在軟件實(shí)現(xiàn)上比較簡(jiǎn)單,需要的內(nèi)存空間比起TCP相對(duì)較小。</p><p>  UDP包頭由4個(gè)域組成,其中每個(gè)域各占用2個(gè)字節(jié)。</p><p> ?。?)源端口號(hào)(16位):UDP數(shù)據(jù)包的發(fā)送方使用的端口號(hào)。</p>

15、<p> ?。?)目標(biāo)端口號(hào)(16位):UDP數(shù)據(jù)包的接收方使用的端口號(hào)。UDP協(xié)議使用端口號(hào)為不同的應(yīng)用保留其各自的數(shù)據(jù)傳輸通道。UDP和rap協(xié)議正是采用這一機(jī)制,實(shí)現(xiàn)對(duì)同一時(shí)刻內(nèi)多項(xiàng)應(yīng)用同時(shí)發(fā)送和接收數(shù)據(jù)的支持。</p><p> ?。?)數(shù)據(jù)報(bào)長(zhǎng)度(16位)。數(shù)據(jù)報(bào)的長(zhǎng)度是指包括報(bào)頭和數(shù)據(jù)部分在內(nèi)的總的字節(jié)數(shù)。理論上,包含報(bào)頭在內(nèi)的數(shù)據(jù)包的最大長(zhǎng)度為65535字節(jié)。不過(guò),一些實(shí)際應(yīng)用往往會(huì)限制

16、數(shù)據(jù)包的大小,有時(shí)會(huì)降低到8192字節(jié)。</p><p> ?。?)校驗(yàn)值(16位)。UDP協(xié)議使用包頭中的校驗(yàn)值來(lái)保證數(shù)據(jù)的安全。</p><p><b>  ××××××</b></p><p> ?。ㄕ淖煮w要求為宋體,字號(hào)為小四,行間距20磅,每段前空2字符)</p>

17、;<p>  2.2 客戶機(jī)/服務(wù)器模式</p><p>  由于這次課程設(shè)計(jì)是實(shí)現(xiàn)點(diǎn)到點(diǎn)的可靠連接,所以在此使用UDP連接方式。在這個(gè)連接中,雙方分為客戶和服務(wù)器,他們各自的功能不同。</p><p>  客戶機(jī)一方,UDP應(yīng)用程序功能如下:</p><p>  (1) 打開(kāi)通信信道(申請(qǐng)一套接字),并連接到服務(wù)器在主機(jī)的保留端口,該端口對(duì)應(yīng)服務(wù)器的

18、UDP進(jìn)程。</p><p>  (2) 向服務(wù)器發(fā)出請(qǐng)求報(bào)文,等待接收應(yīng)答。</p><p> ?。?) 從服務(wù)器方收到最終應(yīng)答結(jié)果,或在不再請(qǐng)求時(shí)關(guān)閉信道并終止客戶機(jī)進(jìn)程。</p><p>  服務(wù)器一方,UDP應(yīng)用程序動(dòng)作如下:</p><p> ?。?) 打開(kāi)通信信道(申請(qǐng)一套接字),通知本地主機(jī)在某一保留端口接收客戶機(jī)請(qǐng)求。<

19、/p><p> ?。?) 等待客戶請(qǐng)求到達(dá)指定端口。</p><p>  (3) 接收到請(qǐng)求,啟動(dòng)一新進(jìn)程處理用戶請(qǐng)求,同時(shí)釋放舊進(jìn)程以響應(yīng)新的客戶請(qǐng)求,一旦服務(wù)完成,關(guān)閉新進(jìn)程與客戶的通信鏈路。</p><p> ?。?) 繼續(xù)等待客戶機(jī)請(qǐng)求。</p><p> ?。?) 如果不想響應(yīng)客戶機(jī)請(qǐng)求,關(guān)閉服務(wù)器進(jìn)程。</p><

20、p><b>  2.3 關(guān)鍵技術(shù)</b></p><p>  Socket又稱作套接字,它是使用 標(biāo)準(zhǔn)Unix 文件描述符 (file descriptor) 和其它程序通訊的方式。使用send()和recv()讓你更好的控制數(shù)據(jù)傳輸。在Java 網(wǎng)絡(luò)編程中,socket相當(dāng)于應(yīng)用程序的港口碼頭;在計(jì)算機(jī)網(wǎng)絡(luò)中,套接字由ip地址和端口號(hào)

21、組成,為進(jìn)程之間通信提供地址。兩個(gè)主機(jī)進(jìn)行通信實(shí)際上就是兩個(gè)主機(jī)中的應(yīng)用進(jìn)程互相通信,應(yīng)用進(jìn)程之間的通信又稱為端到端的通信。為應(yīng)用進(jìn)程之間的通信提供運(yùn)輸服務(wù)的是運(yùn)輸層的運(yùn)輸協(xié)議,運(yùn)輸層需要有兩種不同的運(yùn)輸協(xié)議,即面向連接的TCP和無(wú)連接的UDP。 </p><p>  在Java中,用于實(shí)現(xiàn)基于UDP的聊天程序,使用兩個(gè)重要的類(DatagramSocket類和DatagramPacket類)。Datagra

22、mSocket類表示用來(lái)發(fā)送和接收數(shù)據(jù)報(bào)包的套接字。數(shù)據(jù)報(bào)套接字是包投遞服務(wù)的發(fā)送或接收點(diǎn)。每個(gè)在數(shù)據(jù)報(bào)套接字上發(fā)送或接收的包都是單獨(dú)編址和路由的。從一臺(tái)機(jī)器發(fā)送到另一臺(tái)機(jī)器的多個(gè)包可能選擇不同的路由,也可能按不同的順序到達(dá)。 在DatagramSocket上總是啟用UDP廣播發(fā)送。為了接收廣播包,應(yīng)該將 DatagramSocket綁定到通配符地址。在某些實(shí)現(xiàn)中,將DatagramSocket綁定到一個(gè)更加具體的地址時(shí)廣播包也可以被接

23、收。DatagramPacket類表示數(shù)據(jù)報(bào)包。 數(shù)據(jù)報(bào)包用來(lái)實(shí)現(xiàn)無(wú)連接包投遞服務(wù)。每條報(bào)文僅根據(jù)該包中包含的信息從一臺(tái)機(jī)器路由到另一臺(tái)機(jī)器。從一臺(tái)機(jī)器發(fā)送到另一臺(tái)機(jī)器的多個(gè)包可能選擇不同的路由,也可能按不同的順序到達(dá)。不對(duì)包投遞做出保證。服務(wù)程序工作在服務(wù)器的某個(gè)端口上,一旦啟動(dòng)服務(wù),它將在這個(gè)端口上監(jiān)聽(tīng),等待客戶程序發(fā)來(lái)請(qǐng)求,當(dāng)有客戶連接到該端口,accept()方法就返回一個(gè)Socket對(duì)象,可以用該對(duì)象獲得</p>

24、<p>  (1)建立一個(gè)服務(wù)者,端口為6666。</p><p>  (2)服務(wù)者永遠(yuǎn)等待,一旦客戶送來(lái)正確的請(qǐng)求,連接至該端口,accept()方法就返回一個(gè)Socket對(duì)象。</p><p>  (3)用返回的Socket對(duì)象創(chuàng)建數(shù)據(jù)輸入流類的實(shí)例6666。用返回的Socket對(duì)象創(chuàng)建數(shù)據(jù)輸出流的實(shí)例8888。</p><p>  以上實(shí)例in和o

25、ut是服務(wù)者用于從客戶接受輸入信息和向客戶程序發(fā)送信息所用。此外,還需要用方法receive()和printIn()讀取或輸出一行數(shù)據(jù)。</p><p>  在客戶端建立Socket對(duì)象,并進(jìn)行異常處理,主機(jī)名和端口號(hào)與連接的服務(wù)器名和提供該服務(wù)的服務(wù)程序的監(jiān)聽(tīng)端口必須一致。建立連接后用Socket類提供的Datagramsocket()和Datagrampacket()方法取得輸入輸出流。在服務(wù)器端,獲得的輸入

26、流是客戶端的輸出流,而Socket獲得的輸出流是發(fā)向客戶端的輸入流,在客戶端也是這樣。獲得socket的輸入輸出流之后,為了便于讀寫(xiě)操作,需要在這兩個(gè)流對(duì)象基礎(chǔ)上建立易于操作的數(shù)據(jù)流Datagramsocket, Datagrampacket。然后對(duì)輸入輸出流進(jìn)行讀寫(xiě)操作。在通信結(jié)束時(shí)關(guān)閉socket,以斷開(kāi)連接,釋放資源。先關(guān)閉對(duì)應(yīng)的輸入輸出流,再關(guān)閉socket本身。</p><p><b>  2

27、.4 流程圖</b></p><p><b>  服務(wù)器端</b></p><p><b>  客戶端</b></p><p><b>  2.5 系統(tǒng)結(jié)構(gòu)圖</b></p><p>  2.6 程序調(diào)試及界面效果圖</p><p>  2.

28、6.1 調(diào)試前的準(zhǔn)備</p><p>  安裝jdk1.6.0并在計(jì)算機(jī)的環(huán)境變量中配置好java環(huán)境。使用的實(shí)驗(yàn)環(huán)境是Windows XP,Eclipse 6.0,。使用3太主機(jī)進(jìn)行通信,一臺(tái)作為服務(wù)器,另外兩臺(tái)作為客戶端。</p><p>  2.6.2 程序調(diào)試過(guò)程</p><p>  啟動(dòng)eclipse首先在一臺(tái)主機(jī)上運(yùn)行服務(wù)器端程序,再在另外兩臺(tái)機(jī)器上運(yùn)行

29、客戶端程序。然后進(jìn)入到用戶的圖形用戶界面,輸入客戶端的IP,進(jìn)行連接,如果連接成功,則客戶端就可以通過(guò)與服務(wù)器端進(jìn)行通信,然后服務(wù)器轉(zhuǎn)發(fā)通信,實(shí)現(xiàn)了兩個(gè)客戶端之間的聊天功能。</p><p>  2.6.3 程序運(yùn)行結(jié)果</p><p>  服務(wù)器(192.168.1.77)</p><p>  ChatApp_01客戶端(192.168.1.68)</p&g

30、t;<p>  ChatApp_02客戶端(192.168.1.78)</p><p>  ChatApp_03客戶端(192.168.1.88)</p><p><b>  2.7 源代碼</b></p><p>  ChatFram.java</p><p>  package ChatFrame_01

31、;</p><p>  import java.net.*;</p><p>  import java.io.*;</p><p>  import java.awt.*;</p><p>  import java.awt.event.*;</p><p>  import javax.swing.*;</p

32、><p>  import java.lang.*;</p><p>  import java.awt.color.*;</p><p>  import javax.swing.JOptionPane;</p><p>  public class ChatFrame extends JFrame {</p><p>

33、  JPanel contentPane;</p><p>  JLabel label1 = new JLabel();// 發(fā)送消息</p><p>  JLabel label2 = new JLabel();// 輸入ip</p><p>  Label label3 = new Label();// 輸入端口標(biāo)簽</p><p> 

34、 Label label4 = new Label();// 輸出端口標(biāo)簽</p><p>  JTextField textField1 = new JTextField();// 發(fā)送消息</p><p>  JTextField textField2 = new JTextField();// 輸入ip</p><p>  JTextField textFie

35、ld3 = new JTextField();// 獲得輸入端口</p><p>  JTextField textField4 = new JTextField();// 獲得輸出端口</p><p>  JButton button1 = new JButton("發(fā)送");// 發(fā)送消息</p><p>  TextArea textAre

36、a1 = new TextArea();</p><p>  JOptionPane jopane = new JOptionPane();</p><p>  DatagramPacket sendpacket, receivepacket;// 聲明發(fā)送和接收數(shù)據(jù)包</p><p>  DatagramSocket sendsocket, receivesock

37、et;// 聲明發(fā)送和接收DatagramSocket</p><p>  public ChatFrame() {</p><p>  enableEvents(AWTEvent.WINDOW_EVENT_MASK);</p><p><b>  try {</b></p><p><b>  toInit(

38、);</b></p><p>  } catch (Exception e) {</p><p>  e.printStackTrace();</p><p><b>  }</b></p><p><b>  }</b></p><p>  private vo

39、id toInit() throws Exception {</p><p>  contentPane = (JPanel) this.getContentPane();</p><p>  label1.setText("發(fā)送信息:");</p><p>  label1.setBounds(new Rectangle(13, 100, 60

40、, 21));</p><p>  contentPane.setLayout(null);</p><p>  contentPane.setBackground(Color.pink);</p><p>  this.setSize(new Dimension(363, 502));</p><p>  this.setTitle(&qu

41、ot;多人聊天室");</p><p>  label2.setText("輸入對(duì)方IP地址:");</p><p>  label2.setBounds(new Rectangle(12, 19, 109, 23));</p><p>  label3.setText("輸入端口:");</p>&l

42、t;p>  label3.setBounds(new Rectangle(12, 58, 55, 22));</p><p>  label4.setText("輸出端口:");</p><p>  label4.setBounds(new Rectangle(180, 58, 55, 22));</p><p>  textField3.

43、setText("3000");</p><p>  textField4.setText("3001");</p><p>  button1.setBounds(new Rectangle(280, 100, 59, 21));</p><p>  button1.addActionListener(new java.aw

44、t.event.ActionListener() {</p><p>  public void actionPerformed(ActionEvent e) {</p><p>  button1_actionPerformed(e);</p><p><b>  }</b></p><p><b>  })

45、;</b></p><p>  textField1.addKeyListener(new KeyAdapter() {</p><p>  public void keyPressed(KeyEvent e) {</p><p>  if (e.getKeyCode() == KeyEvent.VK_ENTER) {</p><p&

46、gt;  String str = textField2.getText();</p><p>  String str1=textField1.getText();</p><p>  if (str.compareTo("") != 0&&!"".equals(str1)) {</p><p><b&

47、gt;  try {</b></p><p>  textArea1.append("\nto " + textField2.getText()</p><p>  + ":" + "3000" + " say: "</p><p>  + textField1.getTex

48、t());</p><p>  String s = textField1.getText();</p><p>  byte data[] = s.getBytes("UTF-8");</p><p>  sendpacket = new DatagramPacket(</p><p><b>  data,&

49、lt;/b></p><p>  data.length,</p><p>  InetAddress.getByName("192.168.1.77"),</p><p><b>  6666);</b></p><p>  sendsocket.send(sendpacket);</p

50、><p>  } catch (IOException exc) {</p><p>  exc.printStackTrace();</p><p><b>  }</b></p><p>  textField1.setText("");</p><p><b>  

51、}</b></p><p><b>  }</b></p><p><b>  }</b></p><p><b>  });</b></p><p>  textField4.setBounds(new Rectangle(240, 58, 90, 22));&l

52、t;/p><p>  textField3.setBounds(new Rectangle(70, 58, 90, 22));</p><p>  textField2.setBounds(new Rectangle(123, 20, 120, 19));</p><p>  textField1.setBounds(new Rectangle(76, 100, 190

53、, 19));</p><p>  textArea1.setBounds(new Rectangle(11, 140, 333, 315));</p><p>  textArea1.setEditable(false);</p><p>  textArea1.setBackground(Color.white);</p><p>  c

54、ontentPane.add(label4, null);</p><p>  contentPane.add(label3, null);</p><p>  contentPane.add(label2, null);</p><p>  contentPane.add(label1, null);</p><p>  contentPa

55、ne.add(textField1, null);</p><p>  contentPane.add(textField2, null);</p><p>  contentPane.add(textField3, null);</p><p>  contentPane.add(textField4, null);</p><p>  c

56、ontentPane.add(textArea1, null);</p><p>  contentPane.add(button1, null);</p><p>  this.setVisible(true);</p><p><b>  bind();</b></p><p><b>  }</b&

57、gt;</p><p>  protected void processWindowEvent(WindowEvent e) {</p><p>  super.processWindowEvent(e);</p><p>  if (e.getID() == WindowEvent.WINDOW_CLOSING) {</p><p>  S

58、ystem.exit(0);</p><p><b>  }</b></p><p><b>  }</b></p><p>  public void waitforpackets() {// 檢測(cè)并接受對(duì)方發(fā)來(lái)的消息</p><p>  while (true) {</p><

59、;p><b>  try {</b></p><p>  byte[] array = new byte[100];</p><p>  receivepacket = new DatagramPacket(array, array.length);</p><p>  receivesocket.receive(receivepacke

60、t);// 接收</p><p>  textArea1.append("\nfrom " + receivepacket.getAddress() + ":"</p><p>  + receivepacket.getPort() + " get:");</p><p>  String received

61、 = new String(receivepacket.getData(), 0,</p><p>  receivepacket.getLength(), "UTF-8");</p><p>  textArea1.append(received);</p><p>  } catch (IOException se) {</p>

62、<p>  se.printStackTrace();</p><p><b>  }</b></p><p><b>  }</b></p><p><b>  }</b></p><p>  void bind() {// 和對(duì)方建立連</p>&

63、lt;p><b>  try {</b></p><p>  sendsocket = new DatagramSocket(3000);</p><p>  receivesocket = new DatagramSocket(3333);</p><p>  } catch (Exception e) {</p><

64、;p><b>  }</b></p><p><b>  }</b></p><p>  void button1_actionPerformed(ActionEvent e) {// 發(fā)送消息到對(duì)方</p><p>  String str = textField2.getText();</p>&l

65、t;p>  String str1=textField1.getText();</p><p>  if (str.compareTo("") != 0&&!"".equals(str1)) {</p><p><b>  try {</b></p><p>  textArea1.

66、append("\nto " + textField2.getText() + ":" + "3000"</p><p>  + " say: " + textField1.getText());</p><p>  String s = textField2.getText()+"|"+t

67、extField1.getText();</p><p>  byte data[] = s.getBytes("UTF-8");</p><p>  sendpacket = new DatagramPacket(data, data.length, InetAddress</p><p>  .getByName("192.168.

68、1.77"), 6666);</p><p>  sendsocket.send(sendpacket);</p><p>  } catch (IOException exc) {</p><p>  exc.printStackTrace();</p><p><b>  }</b></p>

69、<p>  textField1.setText("");</p><p><b>  }</b></p><p><b>  }</b></p><p><b>  }</b></p><p>  ChatApp.java</p>

70、<p>  package ChatFrame_01;</p><p>  import java.io.*;</p><p>  import javax.swing.UIManager;</p><p>  import java.awt.*;</p><p>  public class ChatApp {</p>

71、<p>  boolean packFrame = false;</p><p>  ChatApp() {</p><p>  ChatFrame frame = new ChatFrame();</p><p>  if (packFrame) {</p><p>  frame.pack();</p><

72、;p><b>  } else {</b></p><p>  frame.validate();</p><p><b>  }</b></p><p>  // 放置窗體在屏幕中央</p><p>  Dimension screenSize = Toolkit.getDefaultToo

73、lkit().getScreenSize();</p><p>  Dimension frameSize = frame.getSize();</p><p>  if (frameSize.height > screenSize.height) {</p><p>  frameSize.height = screenSize.height;</p&

74、gt;<p><b>  }</b></p><p>  if (frameSize.width > screenSize.width) {</p><p>  frameSize.width = screenSize.width;</p><p><b>  }</b></p><

75、p>  frame.setLocation((screenSize.width - frameSize.width) / 2,</p><p>  (screenSize.height - frameSize.height) / 2);</p><p>  frame.setVisible(true);</p><p>  frame.waitforpacke

76、ts();</p><p><b>  }</b></p><p>  public static void main(String[] args) {</p><p>  new ChatApp();</p><p><b>  }</b></p><p><b>

77、;  }</b></p><p>  Server.java</p><p>  package ChatFrame_01;</p><p>  import java.net.DatagramPacket;</p><p>  import java.net.DatagramSocket;</p><p>

78、;  import java.net.InetAddress;</p><p>  import java.net.Socket;</p><p>  import java.util.*;</p><p>  public class Server {</p><p>  List ips = new ArrayList();</p&

79、gt;<p>  DatagramSocket socket;</p><p>  DatagramPacket packet;</p><p>  DatagramSocket ssocket;</p><p>  DatagramPacket spacket;</p><p>  public Server() throws

80、 Exception {</p><p>  socket = new DatagramSocket(6666);</p><p>  ssocket=new DatagramSocket(8888);</p><p><b>  }</b></p><p>  public void listen() throws E

81、xception {</p><p>  byte[] array = new byte[100];</p><p>  packet = new DatagramPacket(array, array.length);</p><p>  socket.receive(packet);</p><p>  byte[] data=packe

82、t.getData();</p><p>  String received = new String(data,0,data.length,"UTF-8");</p><p>  System.out.println(received);</p><p>  String[] ss = received.split("\\|"

83、;);</p><p>  String ip = ss[0];</p><p>  byte[] dt=ss[1].getBytes("UTF-8");</p><p>  spacket=new DatagramPacket(dt,dt.length,InetAddress.getByName(ip),3333);</p>&l

84、t;p>  ssocket.send(spacket);</p><p><b>  }</b></p><p>  public static void main(String[] args) throws Exception {</p><p>  Server s = new Server();</p><p&g

85、t;  while (true) {</p><p>  s.listen();</p><p><b>  }</b></p><p><b>  }</b></p><p><b>  }</b></p><p><b>  3設(shè)計(jì)總結(jié)&l

86、t;/b></p><p>  這次課設(shè)我們是四個(gè)人一起完成的,在設(shè)計(jì)過(guò)程中,由于我們對(duì)java知識(shí)的掌握不夠,因此參考了很多課外的相關(guān)書(shū)籍,并且在很多同學(xué)的幫忙下共同完成的。</p><p>  通過(guò)實(shí)踐讓我們進(jìn)一步掌握了網(wǎng)絡(luò)和Java的結(jié)合,實(shí)現(xiàn)了網(wǎng)絡(luò)編程。充分了解了基于UDP編程和功能模塊化的優(yōu)越性,這樣便于維護(hù)和修改,并且很容易找到它有可能出現(xiàn)的錯(cuò)誤和漏洞。當(dāng)編譯沒(méi)有錯(cuò)誤的時(shí)

87、候,進(jìn)行執(zhí)行時(shí),往往開(kāi)始幾次都不能達(dá)到自己的理想效果,這個(gè)時(shí)候的修改工作往往更加復(fù)雜,尤其是這個(gè)程序,整個(gè)程序大體上由幾個(gè)類來(lái)控制,但是其實(shí)里面的類與類相互之間的聯(lián)系很多,類與類相互之間相互交織在一起,在設(shè)計(jì)的時(shí)候我就考慮了把實(shí)現(xiàn)一些功能類似的按鈕的事件響應(yīng)放到一起,這樣在編譯出錯(cuò)時(shí)就能很容易的修改錯(cuò)誤,看起來(lái)也清晰明了,所以功能模塊化對(duì)程序的閱讀、調(diào)試、修改起了很重要的作用。但是這個(gè)程序從整體上的設(shè)計(jì)就導(dǎo)致了程序本身很難把各個(gè)功能模塊

88、化,這也是程序的一個(gè)BUG,如果改進(jìn)的化要從開(kāi)始設(shè)計(jì)的時(shí)候幾個(gè)大類要重新規(guī)劃。</p><p>  在設(shè)計(jì)程序的時(shí)候還要考慮到用戶的非法操作而可能引起的系統(tǒng)錯(cuò)誤和數(shù)據(jù)丟失,該程序在這方面做的不好,編程過(guò)程中沒(méi)有充分考慮了各種可能出錯(cuò)的情況,糾錯(cuò)功能并不完善。改進(jìn)的時(shí)候要把糾錯(cuò)功能充分的考慮進(jìn)去。</p><p>  其實(shí)編寫(xiě)程序不僅僅讓我們學(xué)到和更進(jìn)一步的理解了語(yǔ)言算法的結(jié)構(gòu)和思想,還進(jìn)一

89、步培養(yǎng)了我們縝密的思維,考慮問(wèn)題更加周到。總之,要想學(xué)好更好,我們?nèi)孕枧囵B(yǎng)更好的默契和付出更多的努力。</p><p>  總的來(lái)說(shuō),這次設(shè)計(jì)的基于UDP協(xié)議的網(wǎng)絡(luò)聊天程序還是比較成功的,在設(shè)計(jì)中遇到了很多問(wèn)題,最后在老師的辛勤指導(dǎo)下,終于迎刃而解,有點(diǎn)小小的成就感,終于覺(jué)得平時(shí)所學(xué)的知識(shí)有了實(shí)用的價(jià)值,達(dá)到了理論與實(shí)際相結(jié)合的目的,不僅學(xué)到了不少知識(shí),而且鍛煉了自己的能力,使自己對(duì)以后的路有了更加清楚的認(rèn)識(shí),同

90、時(shí),對(duì)未來(lái)有了更多的信心。最后,對(duì)給過(guò)我?guī)椭乃型瑢W(xué)和各位指導(dǎo)老師再次表示忠心的感謝!</p><p><b>  4參考文獻(xiàn)</b></p><p>  [1] 袁慶龍,候文義.Ni-P合金鍍層組織形貌及顯微硬度研究[J].太原理工大學(xué)學(xué)報(bào),2001,32(1):51-53.(連續(xù)出版物:[序號(hào)] 主要責(zé)任者.文獻(xiàn)題名[J].刊名,出版年份,卷號(hào)(期號(hào)):起止頁(yè)碼

91、)</p><p>  [2] 劉國(guó)鈞,王連成.圖書(shū)館史研究[M].北京:高等教育出版社,1979:15-18,31.(專著:[序號(hào)] 主要責(zé)任者.文獻(xiàn)題名[M].出版地:出版者,出版年:起止頁(yè)碼.)</p><p>  [3] 孫品一.高校學(xué)報(bào)編輯工作現(xiàn)代化特征[C].中國(guó)高等學(xué)校自然科學(xué)學(xué)報(bào)研究會(huì).科技編輯學(xué)論文集(2).北京:北京師范大學(xué)出版社,1998:10-22.(論文

溫馨提示

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

評(píng)論

0/150

提交評(píng)論