版權(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 網(wǎng)上聊天室.doc
- 網(wǎng)上聊天室.doc
- 網(wǎng)上聊天室.doc
- 網(wǎng)上聊天室.doc
- 網(wǎng)上聊天室.doc
- 畢業(yè)論文——網(wǎng)上聊天室
- 畢業(yè)論文——網(wǎng)上聊天室 (3)
- 基于JSP的網(wǎng)上聊天室系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn).pdf
- 畢業(yè)論文——網(wǎng)上聊天室 (3)
- 畢業(yè)論文——網(wǎng)上聊天室 (3)
- 畢業(yè)論文——網(wǎng)上聊天室 (2)
- asp網(wǎng)上聊天室系統(tǒng)設(shè)計(jì)與開(kāi)發(fā)帶論文
- 基于udp協(xié)議的聊天程序設(shè)計(jì)報(bào)告
- 網(wǎng)上聊天:挑戰(zhàn)大學(xué)生道德社會(huì)化.pdf
- asp網(wǎng)上聊天室系統(tǒng)設(shè)計(jì)與開(kāi)發(fā)帶論文
- 基于asp.net的網(wǎng)上聊天系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)畢業(yè)設(shè)計(jì)
- 網(wǎng)絡(luò)協(xié)議課程設(shè)計(jì)基于udp的多人聊天系統(tǒng)源代碼
- 計(jì)算機(jī)畢業(yè)論文---網(wǎng)上聊天室設(shè)計(jì)與實(shí)現(xiàn)
- 網(wǎng)上聊天對(duì)初中生人際關(guān)系的影響及應(yīng)對(duì)措施.pdf
- java課程設(shè)計(jì)-聊天程序
評(píng)論
0/150
提交評(píng)論