




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)
文檔簡介
1、 計算機網(wǎng)絡(luò)課程設(shè)計利用java 實現(xiàn)UDP協(xié)議系 別計算機與通信工程學(xué)院專 業(yè)計算機科學(xué)與技術(shù)學(xué) 號4110415姓 名張振指導(dǎo)教師王聰2014年7月4日1. 需求分析程序是如何通過網(wǎng)絡(luò)進行相互通信的呢?各個孤立的工作站或主機用物理鏈路相連在一起,組成數(shù)據(jù)鏈路,從而達到資源共享和通信的目的,就形成網(wǎng)絡(luò)。通信是人與人之間同過某種媒體進行的信息交流與傳遞。網(wǎng)絡(luò)通信一般指網(wǎng)絡(luò)協(xié)議。當(dāng)今網(wǎng)絡(luò)協(xié)議有很多,其中基本最常用的就是TCP/IP 協(xié)議族。UDP協(xié)議就是屬于TCP/IP協(xié)議族中的協(xié)議。在網(wǎng)絡(luò)中它與TCP協(xié)議一樣用于處理數(shù)據(jù)包。在OSI模型中,UDP協(xié)議在第四層傳輸層,處于IP協(xié)議的上一層。與TC
2、P相比,UDP有不提供數(shù)據(jù)報分組、組裝和不能對數(shù)據(jù)包的排序的缺點,也就是說,當(dāng)報文發(fā)送之后,是無法得知其是否安全完整到達的。本文利用Java語言網(wǎng)絡(luò)編程的思想,編寫UDP協(xié)議程序,實現(xiàn)UDP協(xié)議在網(wǎng)絡(luò)中所要完成的功能。在Java語言為實現(xiàn)程序的相互通信提供了許多有用的抽象應(yīng)用程序接口(API, Application Programming Interface),這類應(yīng)用程序接口被稱為套接字(sockets)。因此,本文UDP協(xié)議的編程所需要用到的接口就是套接字。2. 實驗環(huán)境開發(fā)環(huán)境: 個人PC+win8.1+myeclipse 103. 實驗原理以及相關(guān)內(nèi)容3.1 UDP簡介UDP 是Us
3、er Datagram Protocol的簡稱,中文全稱是用戶數(shù)據(jù)包協(xié)議,是一種無連接的傳輸層協(xié)議,提供面向事務(wù)的簡單不可靠信息傳送服務(wù)。在網(wǎng)絡(luò)中它與TCP協(xié)議一樣用于處理數(shù)據(jù)包。在OSI模型中,UDP協(xié)議在第四層傳輸層,處于IP協(xié)議的上一層。與TCP相比,UDP有不提供數(shù)據(jù)報分組、組裝和不能對數(shù)據(jù)包的排序的缺點,也就是說,當(dāng)報文發(fā)送之后,是無法得知其是否安全完整到達的。UDP用來支持那些需要在計算機之間傳輸數(shù)據(jù)的網(wǎng)絡(luò)應(yīng)用。包括網(wǎng)絡(luò)視頻會議系統(tǒng)在內(nèi)的眾多的客戶/服務(wù)器模式的網(wǎng)絡(luò)應(yīng)用都需要使用UDP協(xié)議。3.2 使用UDP原因UDP協(xié)議從問世至今已經(jīng)被使用了很多年,雖然其最初的光彩已經(jīng)被一些類似
4、協(xié)議所掩蓋,但是即使是在今天,UDP仍然不失為一項非常實用和可行的網(wǎng)絡(luò)傳輸層協(xié)議。這是因為UDP 有以下特點:(1)UDP是一個無連接協(xié)議,傳輸數(shù)據(jù)之前源端和終端不建立連接,當(dāng)它想傳送時就簡單地去抓取來自應(yīng)用程序的數(shù)據(jù),并盡可能快地把它扔到網(wǎng)絡(luò)上。(2)由于傳輸數(shù)據(jù)不建立連接,因此也就不需要維護連接狀態(tài),包括收發(fā)狀態(tài)等,因此一臺服務(wù)機可同時向多個客戶機傳輸相同的消息。(3)UDP信息包的標(biāo)題很短,只有8個字節(jié),相對于TCP的20個字節(jié)信息包的額外開銷很小。(4)吞吐量不受擁擠控制算法的調(diào)節(jié),只受應(yīng)用軟件生成數(shù)據(jù)的速率、傳輸帶寬、源端和終端主機性能的限制。(5)UDP使用盡最大努力交付,即不保證
5、可靠交付,因此主機不需要維持復(fù)雜的鏈接狀態(tài)表(這里面有許多參數(shù))。(6)UDP是面向報文的。發(fā)送方的UDP對應(yīng)用程序交下來的報文,在添加首部后就向下交付給IP層。既不拆分,也不合并,而是保留這些報文的邊界,因此,應(yīng)用程序需要選擇合適的報文大小。3.3 UDP套接字UDP協(xié)議提供了一種不同于TCP協(xié)議的端到端服務(wù)。實際上UDP協(xié)議只實現(xiàn)兩個功能: (1).在IP協(xié)議的基礎(chǔ)上添加了另一層地址(端口); (2).對數(shù)據(jù)傳輸過程中可能產(chǎn)生的數(shù)據(jù)錯誤進行了檢測,并拋棄已經(jīng)損壞的數(shù)據(jù)。由于其簡單性,UDP套接字具有一些與我們之前所看到的TCP套接字不同的特征。例如,UDP套接字在使用前不需要進行連接。TC
6、P協(xié)議與電話通信相似,而UDP協(xié)議則與郵件通信相似:你寄包裹或信件時不需要進行“連接”,但是你得為每個包裹和信件指定目的地址。類似的,每條信息(即數(shù)據(jù)報文,datagram)負(fù)載了自己的地址信息,并與其他信息相互獨立。在接收信息時,UDP套接字扮演的角色就像是一個信箱,從不同地址發(fā)送來的信件和包裹都可以放到里面。一旦被創(chuàng)建,UDP套接字就可以用來連續(xù)地向不同的地址發(fā)送信息,或從任何地址接收信息。UDP套接字與TCP套接字的另一個不同點在于他們對信息邊界的處理方式不同:UDP套接字將保留邊界信息。這個特性使應(yīng)用程序在接受信息時,從某些方面來說比使用TCP套接字更簡單。最后一個不同點是,UDP協(xié)議
7、所提供的端到端傳輸服務(wù)是盡力而為(best-effort)的,即UDP套接字將盡可能地傳送信息,但并不保證信息一定能成功到達目的地址,而且信息到達的順序與其發(fā)送順序不一定一致(就像通過郵政部門寄信一樣)。因此,使用了UDP套接字的程序必須準(zhǔn)備好處理信息的丟失和重排。4. 實驗內(nèi)容4.1 流程圖UDP應(yīng)用程序原理圖UDP應(yīng)用程序流程圖4.2 實例解析3.3.1 UDP服務(wù)器端UDP服務(wù)器要執(zhí)行以下三步: (1).創(chuàng)建一個DatagramSocket實例,指定本地端口號,并可以選擇指定本地地址。此時,服務(wù)器已經(jīng)準(zhǔn)備好從任何客戶端接收數(shù)據(jù)報文。 (2).使用DatagramSocket類的recei
8、ve()方法老接收一個DatagramPacket實例。當(dāng)receive() 方法返回時,數(shù)據(jù)報文就包含了客戶端的地址與端口,這樣我們就知道回復(fù)信息該發(fā)送到什么地方。(3).使用DatagramSocket類的send()和receive()方法發(fā)送和接收DatagramPacket實例,進行通信。/服務(wù)器類UDPServerBean.javapackage UDP;import java.io.*;import .*;public class UDPServerBean private DatagramSocket dSocket;private int ClientPort;private
9、 int ServerPort;private InetAddress ServerIP;private InetAddress ClientIP;private String content;/ 無參構(gòu)造函數(shù)public UDPServerBean() throws SocketException,UnknownHostException ClientPort = 1111;ServerPort = 1001;content = ""ClientIP = InetAddress.getLocalHost();ServerIP = InetAddress.getLocalH
10、ost();dSocket = new DatagramSocket(ServerPort);/ 信息發(fā)送函數(shù),將接收到的信息發(fā)回給用戶public void sendToClient() throws IOExceptionbyte Buffer = ("服務(wù)器已經(jīng)收到:n "+content).getBytes(); / 將要發(fā)送的信息給Buffer變量DatagramPacket dPacket = new DatagramPacket(Buffer,Buffer.length,getClientIP(),getClientPort(); /創(chuàng)建DatagramPac
11、ket對象dPacket,并設(shè)置客戶機的IP地址與端口號dSocket.send(dPacket); /發(fā)送信息/ 以下全是UDPServerBean類的各個成員變量的get和set方法public InetAddress getServerIP() return ServerIP;public void setServerIP(InetAddress serverIP) throws Exception ServerIP = serverIP;public DatagramSocket getdSocket() return dSocket;public void setdSocket(Da
12、tagramSocket dSocket) this.dSocket = dSocket;public int getClientPort() return ClientPort;public void setClientPort(int clientPort) ClientPort = clientPort;public int getServerPort() return ServerPort;public void setServerPort(int serverPort) throws SocketException ServerPort = serverPort;public Str
13、ing getContent() return content;public void setContent(String content) this.content = content;public InetAddress getClientIP() return ClientIP;public void setClientrIP(InetAddress clientIP) ClientIP = clientIP;/服務(wù)器端代碼,UDPServer.javapackage UDP;import java.awt.*;import java.awt.event.*;import java.io
14、.*;import .*;import javax.swing.*;public class UDPServer extends JAppletprivate UDPServerBean server;private Thread thread;private JTextField jtf_ServerPort = new JTextField(10);private JButton jbt_Strat = new JButton("啟動");private JButton jbt_Exit= new JButton("退出");private JTex
15、tArea jta_Server = new JTextArea();public UDPServer() JPanel jplServer11 = new JPanel();jplServer11.add(new JLabel("服務(wù)器端口:");jplServer11.add(jtf_ServerPort);JPanel jplServer21= new JPanel();jplServer21.add(jbt_Strat);jplServer21.add(jbt_Exit);JPanel jplServer0= new JPanel();jplServer0.setL
16、ayout(new GridLayout(2,1);jplServer0.add(jplServer11,BorderLayout.NORTH);jplServer0.add(jplServer21);add(jplServer0,BorderLayout.NORTH);add(new JScrollPane(jta_Server),BorderLayout.CENTER);/ 使用線程thread = new Thread(new Runnable()public void run() receiveForemClient(); /調(diào)用發(fā)送函數(shù) );/啟動按鈕事件jbt_Strat.addA
17、ctionListener(new ActionListener()public void actionPerformed(ActionEvent e) int serPort = Integer.parseInt(jtf_ServerPort.getText(); / 從jtf_ServerPort文本區(qū)中取服務(wù)器的端口號try server = new UDPServerBean(); /創(chuàng)建服務(wù)器UDPServerBean的類對象server.setServerPort(serPort); /將取得的服務(wù)器端口serPort給server對象jta_Server.setText(&quo
18、t;設(shè)置服務(wù)器端口為 "+jtf_ServerPort.getText()+" ,服務(wù)器開啟.n"); / 將服務(wù)器端設(shè)置好的信息顯示在jta_Server文本域中thread.start(); /啟動線程 catch (SocketException e2) e2.printStackTrace();catch (UnknownHostException e1) e1.printStackTrace(); catch (Exception e1) e1.printStackTrace(););/ 退出按鈕的觸發(fā)事件jbt_Exit.addActionListen
19、er(new ActionListener() public void actionPerformed(ActionEvent e) System.exit(0););/ 接收客戶端的信息,并將接收到的信息發(fā)回給客戶機public void receiveForemClient()String rec_str = null;byte Buffer = new byte 1024; try server.setdSocket(new DatagramSocket(server.getServerPort(),server.getServerIP(); / server對象調(diào)用setdSocket
20、()函數(shù),創(chuàng)建新Socket對象(此時服務(wù)器端口號為設(shè)定的端口號) catch (SocketException e) e.printStackTrace();DatagramPacket dPacket = new DatagramPacket(Buffer,Buffer.length); /創(chuàng)建DatagramPacket對象dPacketwhile(true) / 用循環(huán)監(jiān)聽信息接收try server.getdSocket().receive(dPacket); /接受信息,將接收到的信息存放在dPacket對象中rec_str = new String(dPacket.getData
21、(),0,dPacket.getLength(); /取出dPacket對象中接收到的信息server.setClientPort(dPacket.getPort(); / 將dPacket對象中包含的客戶機的端口號給server對象 server.setClientrIP(dPacket.getAddress();/ 將dPacket對象中包含的客戶機的IP給server對象 server.setContent(rec_str); / 將接收的信息給server對象 jta_Server.setText(jta_Server.getText()+"收到IP地址為 "+se
22、rver.getClientIP()+",端口為 "+server.getClientPort()+" 的客戶機的信息有:n "+rec_str+"n"); / 將客戶機的信息與接收的信息顯示在jta_Server文本域中server.sendToClient(); /將信息發(fā)送回去 catch (IOException e) e.printStackTrace();UDP客戶端UDP客戶端首先向被動等待聯(lián)系的服務(wù)器端發(fā)送一個數(shù)據(jù)報文。一個典型的UDP客戶端主要執(zhí)行以下三步: (1).創(chuàng)建一個DatagramSocket實例,可以選擇
23、對本地地址和端口號進行設(shè)置。 (2).使用DatagramSocket類的send()和 receive()方法來發(fā)送和接收DatagramPacket實例,進行通信。(3).通信完成后,使用DatagramSocket類的close()方法來銷毀該套接字。 / 客戶端類 UDPClientBean.javapackage UDP;import java.io.*;import .*;class UDPClientBeanprivate DatagramSocket dSocket; private int ServerPort;private int ClientPort;private I
24、netAddress ServerIP;private InetAddress ClientIP;private String content;/無參構(gòu)造函數(shù)public UDPClientBean() throws SocketException,UnknownHostException ServerPort = 1001;ClientPort =1111;content = ""ClientIP = InetAddress.getLocalHost();ServerIP = InetAddress.getLocalHost();dSocket = new Datagra
25、mSocket(ClientPort);/ 信息發(fā)送函數(shù)public void sendToServer() throws IOExceptionbyte Buffer = getContent().getBytes(); /將要發(fā)送的信息給Buffer變量DatagramPacket dPacket = new DatagramPacket(Buffer,Buffer.length,getServerIP(),getServerPort(); / 創(chuàng)建DatagramPacket對象dPacket,并指定要發(fā)送對象的服務(wù)器的IP地址與端口號dSocket.send(dPacket); / d
26、Socket對象調(diào)用send函數(shù)發(fā)送信息setContent("");/ 信息接收函數(shù)public String receiveFromServer() throws IOExceptionbyte buffer = new byte1024;DatagramPacket dPacket = new DatagramPacket(buffer,buffer.length); / 創(chuàng)建DatagramPacket對象dPacketdSocket.receive(dPacket); / dSocket對象調(diào)用receive函數(shù)接收信息String receive_str = n
27、ew String(dPacket.getData(),0,dPacket.getLength();return receive_str; / 返回接收到的信息/ 下面都是UDPClientBean類的各個成員變量的get和set方法public DatagramSocket getdSocket() return dSocket;public void setdSocket(DatagramSocket dSocket) this.dSocket = dSocket;public int getServerPort() return ServerPort;public void setSer
28、verPort(int serverPort) ServerPort = serverPort;public String getContent() return content;public void setContent(String content) this.content = content;public InetAddress getServerIP() return ServerIP;public void setServerIP(InetAddress serverIP) ServerIP = serverIP;public int getClientPort() return
29、 ClientPort;public void setClientPort(int clientPort) ClientPort = clientPort;public InetAddress getClientIP() return ClientIP;public void setClientIP(InetAddress clientIP) ClientIP = clientIP;/ 客戶端代碼,UDPClient.javapackage UDP;import java.awt.*;import java.awt.event.*;import java.io.*;import .*;impo
30、rt javax.swing.*;public class UDPClient extends JApplet private String content;private UDPClientBean client;private JTextField jtf_ServerIP = new JTextField(10);private JTextField jtf_ServerPort = new JTextField(10);private JTextField jtf_ClientPort = new JTextField(10);private JButton jbt_Set= new
31、JButton("設(shè)置");private JTextArea jta_ClientShow = new JTextArea();private JTextArea jta_ClientInput = new JTextArea();private JButton jbt_Send= new JButton("發(fā)送");private JButton jbt_Exit= new JButton("退出");public UDPClient()JPanel jplClient11 = new JPanel();jplClient11.s
32、etLayout(new GridLayout(3,2);jplClient11.add(new JLabel("客戶端端口:");jplClient11.add(jtf_ClientPort);jplClient11.add(new JLabel("服務(wù)器地址:");jplClient11.add(jtf_ServerIP);jplClient11.add(new JLabel("服務(wù)器端口:");jplClient11.add(jtf_ServerPort);JPanel jplClient10= new JPanel();jpl
33、Client10.add(jplClient11);jplClient10.add(jbt_Set);JPanel jplClient21 = new JPanel();jplClient21.add(jbt_Send);jplClient21.add(jbt_Exit);JPanel jplClient31 = new JPanel();jplClient31.setLayout(new GridLayout(2,1);jplClient31.add(new JScrollPane(jta_ClientShow);jplClient31.add(new JScrollPane(jta_Cli
34、entInput);add(jplClient10,BorderLayout.NORTH);add(jplClient31,BorderLayout.CENTER);add(jplClient21,BorderLayout.SOUTH);/ 設(shè)置按鈕觸發(fā)事件jbt_Set.addActionListener(new ActionListener()public void actionPerformed(ActionEvent e) try client = new UDPClientBean(); /創(chuàng)建UDPClientBean對象int cliPort = Integer.parseInt
35、(jtf_ClientPort.getText(); /將客戶機端口從jtf_ServerPort文本域中取出client.setClientPort(cliPort); /將取出的cliPort給client對象的ClientPort成員變量String serIP = jtf_ServerIP.getText(); / 將服務(wù)器IP從jtf_ServerIP文本域中取出int serPort = Integer.parseInt(jtf_ServerPort.getText(); /將服務(wù)器端口從jtf_ServerPort文本域中取出client.setdSocket(new Datag
36、ramSocket(client.getClientPort(),client.getClientIP(); / client對象調(diào)用setdSocket()函數(shù),創(chuàng)建新Socket對象(此時客戶機端口號為設(shè)定的端口號)client.setServerIP(InetAddress.getByName(serIP); /將取出的serIP給client對象的ServerIP成員變量client.setServerPort(serPort); /將取出的serPort給client對象的ServerPort成員變量jta_ClientShow.setText("將信息發(fā)送到IP為 &qu
37、ot;+jtf_ServerIP.getText()+" 端口為 "+jtf_ServerPort.getText()+" 的服務(wù)器上。n"); / 將信息發(fā)送的對象的服務(wù)器的信息顯示在jta_ClientShow區(qū)域中 catch (SocketException e2) e2.printStackTrace(); catch (UnknownHostException e1) e1.printStackTrace();catch (Exception e1) e1.printStackTrace(););/ 發(fā)送按鈕觸發(fā)事件jbt_Send.addActionListener(new ActionListener()public void actionPerformed(ActionEvent e) client.setContent("");content = jta_ClientInput.getText(); /取jta_ClientInput文本區(qū)域中要發(fā)送的信息client.setContent(content); /將取出的信息給client對對象的content成員變量jta_ClientShow.setText(jta_ClientShow.getTe
溫馨提示
- 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. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024福建西海岸建筑設(shè)計院有限公司下半年招聘26人筆試參考題庫附帶答案詳解
- 達州市市屬國有企業(yè)“達人英才”2024年赴高校引才考生結(jié)論補檢人員及考察聘用筆試參考題庫附帶答案詳解
- 浙江國企招聘2025金華浦江縣國有企業(yè)招聘14人(03)筆試參考題庫附帶答案詳解
- 小角蛙養(yǎng)護知識培訓(xùn)課件
- 浙江國企招聘2024浙江舟山東大城市運營服務(wù)有限公司物業(yè)分公司招聘筆試參考題庫附帶答案詳解
- 2025年度碎石場安全生產(chǎn)合作協(xié)議
- 二零二五年度大學(xué)生就業(yè)指導(dǎo)與職業(yè)規(guī)劃實施合同
- 二零二五年度網(wǎng)絡(luò)安全服務(wù)傭金支付及風(fēng)險防范合同
- 2025年度電商代發(fā)貨與大數(shù)據(jù)分析合作合同
- 2025年度新能源建筑項目入股投資協(xié)議書
- 小學(xué)科學(xué)湘科版六年級下冊全冊同步練習(xí)含答案
- 人教版小學(xué)五年級英語上冊作文專項練習(xí)題
- (2024年)傳染病培訓(xùn)課件
- 乘務(wù)大隊客艙服務(wù)質(zhì)量
- 海智工作站申報計劃書
- 托管崗前培訓(xùn)教學(xué)課件
- 機房運維管理制度
- 昆明撫仙湖鰭魚灣棋盤山度假娛樂旅游區(qū)總體規(guī)劃方案樣本
- 突發(fā)疾病時的安全駕駛方法
- 污水處理廠入河排污口設(shè)置論證報告
- T-SHNA 0005-2023 成人住院患者腸外營養(yǎng)輸注護理
評論
0/150
提交評論