計(jì)算機(jī)網(wǎng)絡(luò)課程設(shè)計(jì)利用java實(shí)現(xiàn)UDP協(xié)議_第1頁(yè)
計(jì)算機(jī)網(wǎng)絡(luò)課程設(shè)計(jì)利用java實(shí)現(xiàn)UDP協(xié)議_第2頁(yè)
計(jì)算機(jī)網(wǎng)絡(luò)課程設(shè)計(jì)利用java實(shí)現(xiàn)UDP協(xié)議_第3頁(yè)
計(jì)算機(jī)網(wǎng)絡(luò)課程設(shè)計(jì)利用java實(shí)現(xiàn)UDP協(xié)議_第4頁(yè)
計(jì)算機(jī)網(wǎng)絡(luò)課程設(shè)計(jì)利用java實(shí)現(xiàn)UDP協(xié)議_第5頁(yè)
已閱讀5頁(yè),還剩10頁(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)介

:匕M"^秦皇島分校NorthEasternUniversityAtQinHuangDao計(jì)算機(jī)網(wǎng)絡(luò)課程設(shè)計(jì)利用java實(shí)現(xiàn)UDP協(xié)議系另計(jì)算機(jī)與通信工程學(xué)院專業(yè)計(jì)算機(jī)科學(xué)與技術(shù)學(xué)號(hào)4110415姓名張振指導(dǎo)教師王聰2014年7月4日1.需求分析程序是如何通過(guò)網(wǎng)絡(luò)進(jìn)行相互通信的呢?各個(gè)孤立的工作站或主機(jī)用物理鏈路相連在一起,組成數(shù)據(jù)鏈路,從而達(dá)到資源共享和通信的目的,就形成網(wǎng)絡(luò)。通信是人與人之間同過(guò)某種媒體進(jìn)行的信息交流與傳遞。網(wǎng)絡(luò)通信一般指網(wǎng)絡(luò)協(xié)議。當(dāng)今網(wǎng)絡(luò)協(xié)議有很多,其中基本最常用的就是TCP/IP協(xié)議族oUDP協(xié)議就是屬于TCP/IP協(xié)議族中的協(xié)議。在網(wǎng)絡(luò)中它與TCP協(xié)議一樣用于處理數(shù)據(jù)包。在OSI模型中,UDP協(xié)議在第四層一一傳輸層,處于IP協(xié)議的上一層。與TCP相比,UDP有不提供數(shù)據(jù)報(bào)分組、組裝和不能對(duì)數(shù)據(jù)包的排序的缺點(diǎn),也就是說(shuō),當(dāng)報(bào)文發(fā)送之后,是無(wú)法得知其是否安全完整到達(dá)的。本文利用Java語(yǔ)言網(wǎng)絡(luò)編程的思想,編寫(xiě)UDP協(xié)議程序,實(shí)現(xiàn)UDP協(xié)議在網(wǎng)絡(luò)中所要完成的功能。在Java語(yǔ)言為實(shí)現(xiàn)程序的相互通信提供了許多有用的抽象應(yīng)用程序接口(API,ApplicationProgrammingInterface),這類應(yīng)用程序接口被稱為套接字(sockets)o因此,本文UDP協(xié)議的編程所需要用到的接口就是套接字。實(shí)驗(yàn)環(huán)境開(kāi)發(fā)環(huán)境:個(gè)人PC+win8.1+myeclipse10實(shí)驗(yàn)原理以及相關(guān)內(nèi)容3.1UDP簡(jiǎn)介UDP是UserDatagramProtocol的簡(jiǎn)稱,中文全稱是用戶數(shù)據(jù)包協(xié)議,是一種無(wú)連接的傳輸層協(xié)議,提供面向事務(wù)的簡(jiǎn)單不可靠信息傳送服務(wù)。在網(wǎng)絡(luò)中它與TCP協(xié)議一樣用于處理數(shù)據(jù)包。在OSI模型中,UDP協(xié)議在第四層一一傳輸層,處于IP協(xié)議的上一層。與TCP相比,UDP有不提供數(shù)據(jù)報(bào)分組、組裝和不能對(duì)數(shù)據(jù)包的排序的

缺點(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)用都需要使用UDPUDP用來(lái)支3.2使用UDP原因UDP協(xié)議從問(wèn)世至今已經(jīng)被使用了很多年,雖然其最初的光彩已經(jīng)被一些類似協(xié)議所掩蓋,但是即使是在今天,UDP仍然不失為一項(xiàng)非常實(shí)用和可行的網(wǎng)絡(luò)傳輸層協(xié)議。這是因?yàn)閁DP有以下特點(diǎn):(1)UDP是一個(gè)無(wú)連接協(xié)議,傳輸數(shù)據(jù)之前源端和終端不建立連接,當(dāng)它想傳送時(shí)就簡(jiǎn)單地去抓取來(lái)自應(yīng)用程序的數(shù)據(jù),并盡可能快地把它扔到網(wǎng)絡(luò)上。(2)由于傳輸數(shù)據(jù)不建立連接,因此也就不需要維護(hù)連接狀態(tài),包括收發(fā)狀態(tài)等,因此一臺(tái)服務(wù)機(jī)可同時(shí)向多個(gè)客戶機(jī)傳輸相同的消息。(3)UDP信息包的標(biāo)題很短,只有8個(gè)字節(jié),相對(duì)于TCP的20個(gè)字節(jié)信息包的額外開(kāi)銷很小。(4)吞吐量不受擁擠控制算法的調(diào)節(jié),只受應(yīng)用軟件生成數(shù)據(jù)的速率、傳輸帶寬、源端和終端主機(jī)性能的限制。(5)UDP使用盡最大努力交付,即不保證可靠交付,因此主機(jī)不需要維持復(fù)雜的鏈接狀態(tài)表(這里面有許多參數(shù))。(6)UDP是面向報(bào)文的。發(fā)送方的UDP對(duì)應(yīng)用程序交下來(lái)的報(bào)文,在添加首部后就向下交付給IP層。既不拆分,也不合并,而是保留這些報(bào)文的邊界,因此,應(yīng)用程序需要選擇合適的報(bào)文大小。3.3UDP套接字UDP協(xié)議提供了一種不同于TCP協(xié)議的端到端服務(wù)。實(shí)際上UDP協(xié)議只實(shí)現(xiàn)兩個(gè)功能:.在IP協(xié)議的基礎(chǔ)上添加了另一層地址(端口);.對(duì)數(shù)據(jù)傳輸過(guò)程中可能產(chǎn)生的數(shù)據(jù)錯(cuò)誤進(jìn)行了檢測(cè),并拋棄已經(jīng)損壞的數(shù)據(jù)。由于其簡(jiǎn)單性,UDP套接字具有一些與我們之前所看到的TCP套接字不同的特征。例如,UDP套接字在使用前不需要進(jìn)行連接。TCP協(xié)議與電話通信相似,而UDP協(xié)議則與郵件通信相似:你寄包裹或信件時(shí)不需要進(jìn)行“連接”,但是你得為每個(gè)包裹和信件指定目的地址。類似的,每條信息(即數(shù)據(jù)報(bào)文,datagram)負(fù)載了自己的地址信息,并與其他信息相互獨(dú)立。在接收信息時(shí),UDP套接字扮演的角色就像是一個(gè)信箱,從不同地址發(fā)送來(lái)的信件和包裹都可以放到里面。一旦被創(chuàng)建,UDP套接字就可以用來(lái)連續(xù)地向不同的地址發(fā)送信息,或從任何地址接收信息。UDP套接字與TCP套接字的另一個(gè)不同點(diǎn)在于他們對(duì)信息邊界的處理方式不同:UDP套接字將保留邊界信息。這個(gè)特性使應(yīng)用程序在接受信息時(shí),從某些方面來(lái)說(shuō)比使用TCP套接字更簡(jiǎn)單。最后一個(gè)不同點(diǎn)是,UDP協(xié)議所提供的端到端傳輸服務(wù)是盡力而為(best-effort)的,即UDP套接字將盡可能地傳送信息,但并不保證信息一定能成功到達(dá)目的地址,而且信息到達(dá)的順序與其發(fā)送順序不一定一致(就像通過(guò)郵政部門(mén)寄信一樣)。因此,使用7UDP套接字的程序必須準(zhǔn)備好處理信息的丟失和重排。實(shí)驗(yàn)內(nèi)容4.1流程圖UDP應(yīng)用程序原理圖UDP應(yīng)用程序流程圖客戶端服勢(shì)器端UDP應(yīng)用程序流程圖客戶端4.2實(shí)例解析3.3.1UDP服務(wù)器端UDP服務(wù)器要執(zhí)行以下三步:(1).創(chuàng)建一個(gè)DatagramSocket實(shí)例,指定本地端口號(hào),并可以選擇指定本地地址。此時(shí),服務(wù)器已經(jīng)準(zhǔn)備好從任何客戶端接收數(shù)據(jù)報(bào)文。.使用DatagramSocket類的receive。方法老接收一個(gè)DatagramPacket實(shí)例。當(dāng)receive。方法返回時(shí),數(shù)據(jù)報(bào)文就包含了客戶端的地址與端口,這樣我們就知道回復(fù)信息該發(fā)送到什么地方。.使用DatagramSocket類的send()和receive。方法發(fā)送和接收DatagramPacket實(shí)例,進(jìn)行通信。//服務(wù)器類UDPServerBean.javapackageUDP;importjava.io.*;.*;publicclassUDPServerBean(privateDatagramSocketdSocketprivateintClientPort;privateintServerPortprivateInetAddressServerlRprivateInetAddressClientIP;privateStringcontent;//無(wú)參構(gòu)造函數(shù)publicUDPServerBean()hrowsSocketException,UnknownHostException(ClientPort=1111;ServerPort=1001;content="";ClientIP=InetAddressgetLocalHos]);ServerIP=InetAddressgetLocalHost[);dSocket=newDatagramSocketServerPort);}//信息發(fā)送函數(shù),將接收到的信息發(fā)回給用戶publicvoidsendToClient()throwsIOException(byte[]Buffer=("服務(wù)器巳經(jīng)收到:\n"+content).getBytes();〃將要發(fā)送的信息給Buffer變量DatagramPacketdPacket=newDatagramPacket(Buffer,Bufferlength,getClientlP(),getClientPort());〃創(chuàng)建DatagramPacke對(duì)象dPacket,并設(shè)置客戶機(jī)的IP地址與端口號(hào)dSocketsend(dPacket);//發(fā)送信息}//以下全是UDPServerBea類的各個(gè)成員變量的get和set方法publicInetAddressgetServerIP()(returnServerIP}publicvoidsetServerIP(InetAddressserverIPt)hrowsException(ServerIP=serverIP;}publicDatagramSocketgetdSocket()(returndSocket}publicvoidsetdSocket(DatagramSocketdSocket)(this.dSocket=dSocket;}publicintgetClientPort()(returnClientPort;}publicvoidsetClientPort(intclientPort)(ClientPort=clientPort;}publicintgetServerPort()(returnServerPort}publicvoidsetServerPort(ntserverPort)throwsSocketException(ServerPort=serverPort;}publicStringgetContent()(returncontent;publicvoidsetContent(Stringcontent)(this.content=content;publicInetAddressgetClientlP()(returnClientip}publicvoidsetClientrIP(InetAddressclientIP)(ClientIP=clientIP;}}〃服務(wù)器端代碼,UDPServer.javapackageUDP;importjava.awt.*;importjava.awt.event.*;importjava.io.*;.*;importjavax.swing.*;publicclassUDPServerextendsJApplet(privateUDPServerBearserver;privateThreadthread;privateJTextFieldjtf_ServerPort=newJTextField(10);privateJButtonjbt_Strat=newJButton("啟動(dòng)");privateJButtonjbt_Exit=newJButton("退出");privateJTextAreajta_Server=newJTextArea();publicUDPServer()(JPaneljplServer11=newJPanel();jplServer11.add(newJLabel服務(wù)器端口:"));jplServer11.add(tf_ServerPort);JPaneljplServer21二newJPanel();jplServer21.add(bt_Strat);jplServer21.add(bt_Exit);JPaneljplServer0二newJPanel();jplServer0.setLayout(iewGridLayout(2,1));jplServer0.add(jplServer11,BorderLayoutNORTH;jplServer0.add(jplServer21);add(jplServerO,BorderLayoutNORTH;add(newJScrollPane(a_Server),BorderLayout.CENTER//使用線程一thread=newThread(newRunnable()(publicvoidrun()(receiveForemClient();//調(diào)用發(fā)送函數(shù)}});//啟動(dòng)按鈕事件jbt_Strat.addActionListener(newActionListener()(publicvoidactionPeformed(ActionEvente)(intserPort=IntegerparseInt(jtf_ServerPort.getText());〃從jtf_ServerPort文本區(qū)中取服務(wù)器的端口號(hào)try(server=newUDPServerBean()//創(chuàng)建服務(wù)器UDPServerBean的類對(duì)象server.setServerPort(serPort);//將取得的服務(wù)器端口serPort給serve對(duì)象jta_Server.setText("設(shè)置服務(wù)器端口為"+jtf_ServerPort.getText()+",服務(wù)器開(kāi)啟.??\n〃);〃將服務(wù)器端設(shè)置好的信息顯示在jta_Server文本域中thread.start();//啟動(dòng)線程}catch(SocketExceptione2)(e2.printStackTrace();}catch(UnknownHostExceptionel)(el.printStackTrace();}catch(Exceptionel)(el?printStackTrace();}}});//退出按鈕的觸發(fā)事件jbt_Exit.addActionListener(newActionListener()(publicvoidactionPeformed(ActionEvente)(Systemexit(0);}});〃接收客戶端的信息,并將接收到的信息發(fā)回給客戶機(jī)publicvoidreceiveForemClient()(Stringrec_str=nuII;byte[]Buffer=newbyte[1024];try(server.setdSocket(iewDatagramSocketServer.getServerPort(),server.getServerlP()));//server對(duì)象調(diào)用setdSocket()函數(shù),創(chuàng)建新Socke對(duì)象(此時(shí)服務(wù)器端口號(hào)為設(shè)定的端口號(hào))}catch(SocketExceptione)(e.printStackTrace();}DatagramPacketdPacket=newDatagramPacket(Buffer,Bufferlength);//創(chuàng)建DatagramPacket象dPacketwhile(true)(//用循環(huán)監(jiān)聽(tīng)信息接收try{_server.getdSocket().receive(dPacket);//接受信息,將接收到的信息存放在dPacke對(duì)象中rec_str=newString(dPacket,getData(),0,dPacket,getLength());〃取出dPacke對(duì)象中接收到的信息server.setClientPort(dPacket.getPort());//將dPacket對(duì)象中包含的客戶機(jī)的端口號(hào)給serve對(duì)象server.setClientrlP(dPacket.getAddress());//將dPacke對(duì)象中包含的客戶機(jī)的IP給server對(duì)象server.setContent(rec_str);//將接收的信息給server對(duì)象jta_Server.setText(jta_Server.getText()+"收到IP地址為"+server.getClientlP()+:端口為"+server,getClientPort()+”的客戶機(jī)的信息有:\n"+rec_str+"\n");〃將客戶機(jī)的信息與接收的信息顯示在jta_Server文本域中server.sendToClient();//將信息發(fā)送回去}catch(IOExceptione){e.printStackTrace();}}}}UDP客戶端UDPUDP客戶端首先向被動(dòng)等待聯(lián)系的服務(wù)器端發(fā)送一個(gè)數(shù)據(jù)報(bào)文。一個(gè)典型的客戶端主要執(zhí)行以下三步:UDP.創(chuàng)建一個(gè)DatagramSocket實(shí)例,可以選擇對(duì)本地地址和端口號(hào)進(jìn)行設(shè)置.使用DatagramSocket類的send()和receive。方法來(lái)發(fā)送和接收DatagramPacket實(shí)例,進(jìn)行通信。.通信完成后,使用DatagramSocket類的close()方法來(lái)銷毀該套接字。//客戶端類UDPClientBean.javapackageUDP;importjava.io.*;.*;classUDPClientBean(privateDatagramSocketdSocketprivateintServerPortprivateintClientPort;privateInetAddressServerlRprivateInetAddressClientIP;privateStringcontent;//無(wú)參構(gòu)造函數(shù)publicUDPClientBean(XhrowsSocketException,UnknownHostException(ServerPort=1001;ClientPort=1111;content="";ClientIP=InetAddressgetLocalHostf);ServerIP=InetAddressgetLocalHostf);dSocket=newDatagramSocketClientPort);}//信息發(fā)送函數(shù)publicvoidsendToServer(XhrowsIOException(byte[]Buffer=getContent().getBytes();//將要發(fā)送的信息給Buffer變量DatagramPacketdPacket=newDatagramPacket(Buffer,Buffer.ength,getServerlP(),getServerPort());//創(chuàng)建DatagramPackw象dPacket,并指定要發(fā)送對(duì)象的服務(wù)器的IP地址與端口號(hào)dSocketsend(dPacket);//dSocket對(duì)象調(diào)用send函數(shù)發(fā)送信息setContent(〃〃);}//信息接收函數(shù)publicStringreceiveFromServer(XhrowsIOException(byte[]buffer=newbyte[1024];DatagramPacketdPacket=newDatagramPacket(buffer,buffer.length);//創(chuàng)建DatagramPacke對(duì)象dPacketdSocketreceive(dPacket);//dSocket對(duì)象調(diào)用receive函數(shù)接收信息Stringreceive_str=newString(dPacket.getData(),O,dPacket.getLength());returnreceive_str;//返回接收到的信息}〃下面都是UDPClientBea類的各個(gè)成員變量的get和set方法publicDatagramSocketgetdSocket()(returndSocket;}publicvoidsetdSocket(DatagramSocketdSocket)(this.dSocket=dSocket;}publicintgetServerPort()(returnServerPort}publicvoidsetServerPort(ntserverPort)(ServerPort=serverPort;}publicStringgetContent()(returncontent;}publicvoidsetContent(Stringcontent)(this.content=content;}publicInetAddressgetServerIP()(returnServerIP}publicvoidsetServerIP(InetAddressserverIP)(ServerIP=serverIP;}publicintgetClientPort()(returnClientPort;}publicvoidsetClientPort(intclientPort)(ClientPort=clientPort;}publicInetAddressgetClientlP()(returnClientIP}publicvoidsetClientIP(InetAddressclientIP)(ClientIP=clientIP;}}//客戶端代碼,UDPClient.javapackageUDP;importjava.awt.*;importjava.awt.event.*;importjava.io.*;.*;importjavax.swing.*;publicclassUDPClientextendsJApplet(privateStringcontent;privateUDPClientBeanclient;privateJTextFieldjtf_ServerlP=newJTextField(10);privateJTextFieldjtf_ServerPort=newJTextField(10);privateJTextFieldjtf_ClientPort=newJTextField(10);privateJButtonjbt_Set=newJButton("設(shè)置");privateJTextAreajta_ClientShow=newJTextArea();privateJTextAreajta_Clientlnput=newJTextArea();privateJButtonjbt_Send=newJButton("發(fā)送");privateJButtonjbt_Exit=newJButton("退出");publicUDPClient()(JPaneljplClient11=newJPanel();jplClient11.setLayout(newGridLayout(3,2));jplClient11.add(newJLabel"客戶端端口:"));jplClient11.add(jtf_ClientPort);jplClient11.add(newJLabel"服務(wù)器地址:"));jplClient11.add(jtf_ServerIP);jpIClient11.add(newJLabel"服務(wù)器端口:jpIClient11.add(jtf_ServerPort);JPaneljpIClient10二newJPanel();jpIClient10.add(jplClient11);jplClient10.add(jbt_Set);JPaneljplClient21=newJPanel();jplClient21.add(jbt_Send);jplClient21.add(jbt_Exit);JPaneljplClient31=newJPanel();jplClient31.setLayout(newGridLayout(2,1));jplClient31.add(newJScrollPanejta_ClientShow));jplClient31.add(newJScrollPanejta_Clientlnput));add(jplClient10,BorderLayout.NORTH;add(jplClient31,BorderLayout.CENTERadd(jplClient21,BorderLayout.SOUTH;〃設(shè)置按鈕觸發(fā)事件jbt_Set.addActionListener(newActionListener()(publicvoidactionPeformed(ActionEvente)(try(client=newUDPClientBean()//創(chuàng)建UDPClientBean寸象intcliPort=Integer.parseInt(jtf_ClientPort.getText());〃將客戶機(jī)端口從jtf_ServerPort文本域中取出client.setClientPort(cliPort);//將取出的cliPort給client對(duì)象的ClientPort成員變量StringserIP=jtf_ServerIP.getText();//將服務(wù)器IP從jtf_ServerlP文本域中取出intserPort=IntegerparseInt(jtf_ServerPort.getText());〃將服務(wù)器端口從jtf_ServerPort文本域中取出client.setdSocketgewDatagramSocket0ient.getClientPort(),client.getClientIP()));//client對(duì)象調(diào)用setdSocket()函數(shù),創(chuàng)建新Socke對(duì)象(此時(shí)客戶機(jī)端口號(hào)為設(shè)定的端口號(hào))client.setServerIP(InetAddressgetByName(serIP));〃將取出的serIP給client對(duì)象的ServerIP成員變量client.setServerPort(serPort);//將取出的serPort給client對(duì)象的ServerPort成員變量jta_ClientShow.setText("將信息發(fā)送到IP為"+jtf_ServerlP.getText()+"端口為"+jtf_ServerPort,getText()+‘的服務(wù)器上。\n");//將信息發(fā)送的對(duì)象的服務(wù)器的信息顯示在jta_ClientShow區(qū)域中}catch(SocketExceptione2)(e2.printStackTrace();}catch(UnknownHostExceptione1)(el.printStackTrace();}catch(Exceptione1)(el.printStackTrace();}}});〃發(fā)送按鈕觸發(fā)事件jbt_Send.addActionListener(newActionListener()(publicvoidactionPeformed(ActionEvente)(client.setContent("");content=jta_Clientlnput.getText();//取jta_ClientInput文本區(qū)域中要發(fā)送的信息一一client.setContent(content);//將取出的信息給client對(duì)對(duì)象的content成員變量jta_ClientShow.setText(jta_ClientShow.getText()+"客戶機(jī)發(fā)送:"+content

溫馨提示

  • 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ù)網(wǎng)僅提供信息存儲(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)論