版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、<p> 計(jì)算機(jī)網(wǎng)絡(luò)課程設(shè)計(jì)報(bào)告</p><p> 編程實(shí)現(xiàn)基于UDP的PING</p><p> 學(xué) 院 計(jì)算機(jī)學(xué)院 </p><p> 專 業(yè) </p><p><b> 學(xué) 號(hào)</b></p><p><b> 學(xué)生姓
2、名 </b></p><p> 指導(dǎo)教師 </p><p> 2017年 6月 </p><p><b> 計(jì)算機(jī)網(wǎng)絡(luò)課程設(shè)計(jì)</b></p><p><b> 程序開(kāi)發(fā)的基礎(chǔ)知識(shí)</b></p><p><b
3、> PING的相關(guān)知識(shí)</b></p><p> Ping是Windows、Unix和Linux系統(tǒng)下的一個(gè)命令。ping也屬于一個(gè)通信協(xié)議,是TCP/IP協(xié)議的一部分。利用“ping”命令可以檢查網(wǎng)絡(luò)是否連通,可以很好地幫助我們分析和判定網(wǎng)絡(luò)故障。應(yīng)用格式:Ping空格IP地址。</p><p> PING (Packet Internet Groper),因特網(wǎng)
4、包探索器,用于測(cè)試網(wǎng)絡(luò)連接量的程序。Ping發(fā)送一個(gè)ICMP(Internet Control Messages Protocol)即因特網(wǎng)信報(bào)控制協(xié)議;回聲請(qǐng)求消息給目的地并報(bào)告是否收到所希望的ICMPecho (ICMP回聲應(yīng)答)。它是用來(lái)檢查網(wǎng)絡(luò)是否通暢或者網(wǎng)絡(luò)連接速度的命令。作為一個(gè)生活在網(wǎng)絡(luò)上的管理員或者黑客來(lái)說(shuō),ping命令是第一個(gè)必須掌握的DOS命令,它所利用的原理是這樣的:利用網(wǎng)絡(luò)上機(jī)器IP地址的唯一性,給目標(biāo)IP地址發(fā)
5、送一個(gè)數(shù)據(jù)包,再要求對(duì)方返回一個(gè)同樣大小的數(shù)據(jù)包來(lái)確定兩臺(tái)網(wǎng)絡(luò)機(jī)器是否連接相通,時(shí)延是多少。</p><p> ping指的是端對(duì)端連通,通常用來(lái)作為可用性的檢查, 但是某些病毒木馬會(huì)強(qiáng)行大量遠(yuǎn)程執(zhí)行ping命令搶占你的網(wǎng)絡(luò)資源,導(dǎo)致系統(tǒng)變慢,網(wǎng)速變慢。嚴(yán)禁ping入侵作為大多數(shù)防火墻的一個(gè)基本功能提供給用戶進(jìn)行選擇。通常的情況下你如果不用作服務(wù)器或者進(jìn)行網(wǎng)絡(luò)測(cè)試,可以放心的選中它,保護(hù)你的電腦。</p&
6、gt;<p><b> UDP的相關(guān)知識(shí)</b></p><p> UDP 是User Datagram Protocol的簡(jiǎn)稱,全稱是用戶數(shù)據(jù)報(bào)協(xié)議 ,在網(wǎng)絡(luò)中它與TCP協(xié)議一樣用于處理數(shù)據(jù)包,是一種無(wú)連接的協(xié)議。在OSI模型中,在第四層——傳輸層,處于IP協(xié)議的上一層。UDP有不提供數(shù)據(jù)包分組、組裝和不能對(duì)數(shù)據(jù)包進(jìn)行排序的缺點(diǎn),也就是說(shuō),當(dāng)報(bào)文發(fā)送
7、之后,是無(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í)用和可行的網(wǎng)絡(luò)傳輸層協(xié)議。</p><p> 與所熟知的TCP(傳輸控制協(xié)議)協(xié)議一樣,UDP協(xié)議直接位于IP(網(wǎng)際協(xié)
8、議)協(xié)議的頂層。根據(jù)OSI(開(kāi)放系統(tǒng)互連)參考模型,UDP和TCP都屬于傳輸層協(xié)議。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> Socket通信機(jī)制相關(guān)知識(shí)</p><p> 網(wǎng)絡(luò)上的兩個(gè)程序通過(guò)一個(gè)雙向的通信連接實(shí)現(xiàn)數(shù)據(jù)的交換,這個(gè)
9、連接的一端稱為一個(gè)socket。</p><p> 建立網(wǎng)絡(luò)通信連接至少要一對(duì)端口號(hào)(socket)。socket本質(zhì)是編程接口(API),對(duì)TCP/IP的封裝,TCP/IP也要提供可供程序員做網(wǎng)絡(luò)開(kāi)發(fā)所用的接口,這就是Socket編程接口;HTTP是轎車,提供了封裝或者顯示數(shù)據(jù)的具體形式;Socket是發(fā)動(dòng)機(jī),提供了網(wǎng)絡(luò)通信的能力。</p><p> Socket的英文原義是“孔”或
10、“插座”。作為BSD UNIX的進(jìn)程通信機(jī)制,取后一種意思。通常也稱作"套接字",用于描述IP地址和端口,是一個(gè)通信鏈的句柄,可以用來(lái)實(shí)現(xiàn)不同虛擬機(jī)或不同計(jì)算機(jī)之間的通信。在Internet上的主機(jī)一般運(yùn)行了多個(gè)服務(wù)軟件,同時(shí)提供幾種服務(wù)。每種服務(wù)都打開(kāi)一個(gè)Socket,并綁定到一個(gè)端口上,不同的端口對(duì)應(yīng)于不同的服務(wù)。Socket正如其英文原意那樣,像一個(gè)多孔插座。一臺(tái)主機(jī)猶如布滿各種插座的房間,每個(gè)插座有一個(gè)編號(hào),
11、有的插座提供220伏交流電, 有的提供110伏交流電,有的則提供有線電視節(jié)目。 客戶軟件將插頭插到不同編號(hào)的插座,就可以得到不同的服務(wù)。</p><p><b> 設(shè)計(jì)思路</b></p><p> 本程序是通過(guò)基于UDP的socket的網(wǎng)絡(luò)編程,來(lái)實(shí)現(xiàn)客戶端和服務(wù)器端的信息傳輸,包括客戶端發(fā)送請(qǐng)求給服務(wù)器端、服務(wù)器端回應(yīng)客戶端,以致實(shí)現(xiàn)PING的效果。</
12、p><p> 具體的思路是通過(guò)調(diào)用java JDK中java.net包下的DatagramSocket和DatagramPacket類,可以實(shí)現(xiàn)對(duì)用戶數(shù)據(jù)報(bào)文的控制,DatagramSocket類用于創(chuàng)建接收和發(fā)送UDP的Socket實(shí)例,調(diào)用DatagramPacket類用于處理報(bào)文,因?yàn)樗梢詫yte數(shù)組、目標(biāo)地址、目標(biāo)端口等數(shù)據(jù)包裝成報(bào)文或者將報(bào)文拆卸成Byte數(shù)組。這樣就可以實(shí)現(xiàn)客戶端和服務(wù)器端的信息交流
13、了。以此來(lái)達(dá)到ping的功能。</p><p> 再通過(guò)多線程編程的思想,讓不同客戶端的請(qǐng)求運(yùn)行在不同的線程,來(lái)實(shí)現(xiàn)服務(wù)器端為多個(gè)客戶端服務(wù)的功能。</p><p><b> 程序流程圖</b></p><p><b> 四.關(guān)鍵數(shù)據(jù)結(jié)構(gòu)</b></p><p> 本程序主要用到的數(shù)據(jù)結(jié)構(gòu)有
14、以下:</p><p> 1.Math.random() * 1000,獲取隨機(jī)數(shù)字</p><p> 2.for (int i = 0; i < 10; i++)</p><p> {if (rtt[i] > maxRtt){maxRtt = rtt[i];}</p><p> if(rtt[i]!=0){if (rt
15、t[i] < minRtt){minRtt = rtt[i];}</p><p> }sumRtt += rtt[i]; },通過(guò)循環(huán)獲取極值。</p><p><b> 五.關(guān)鍵性的代碼</b></p><p> 1.客戶端發(fā)送請(qǐng)求和接收回復(fù)</p><p> DatagramSocket client
16、Socket = new DatagramSocket();//生成client端socket實(shí)例</p><p> InetAddress IPAddress = InetAddress.getByName(address); //生成ip地址實(shí)例</p><p> byte[] sendData = new byte[1024]; //用于接收數(shù)據(jù)的byte數(shù)組</p>
17、;<p> byte[] receiveData = new byte[1024];//用于發(fā)送數(shù)據(jù)的byte數(shù)組</p><p> sendData = sentence.getBytes();</p><p> DatagramPacket sendPacket = new DatagramPacket(sendData, sendData.length, I
18、PAddress, port);//生成發(fā)送數(shù)據(jù)包</p><p> Date sendBefore = new Date();//發(fā)送前時(shí)</p><p> clientSocket.send(sendPacket); //發(fā)送</p><p> DatagramPacket receivePacket = new DatagramPacke
19、t(receiveData,receiveData.length);//生成接收數(shù)據(jù)包</p><p> clientSocket.receive(receivePacket); //接收從server返回的數(shù)據(jù)包</p><p> Date receiveAfter = new Date(); //接收后的時(shí)間 </p><p>
20、//最多等待1秒以便接收PingServer返回的reply消息。如果在該時(shí)間內(nèi)沒(méi)有收到服務(wù)器的reply,則認(rèn)為該請(qǐng)求或?qū)υ撜?qǐng)求的reply已經(jīng)丟失</p><p> String modifiedSentence = "";</p><p> if(receiveAfter.getTime() - sendBefore.getTime()>1000){&l
21、t;/p><p> modifiedSentence = "請(qǐng)求超過(guò)1秒,模擬數(shù)據(jù)丟失??!\n";</p><p> rtt[i-1]=(long)0; //當(dāng)收不到reply時(shí),置折返時(shí)間為0,不加入計(jì)算</p><p> }else{modifiedSentence = new String(receivePacket.getData()
22、);</p><p> rtt[i - 1] = receiveAfter.getTime() - sendBefore.getTime();</p><p><b> }</b></p><p> 2.服務(wù)器端接收請(qǐng)求和回復(fù)客戶端</p><p> new Thread(){@Override</p>
23、;<p> public void run() {</p><p> int cilentCount = 0; //客戶端的數(shù)量(多個(gè)客戶端)</p><p> //服務(wù)器端一直處于接收狀態(tài)</p><p> while (true){</p><p> byte[] sendData = new byte[1024]
24、;</p><p> DatagramPacket receivePacket = new DatagramPacket(receiveData, receiveData.length);//生成接收數(shù)據(jù)報(bào)包實(shí)例</p><p> try {serverSocket.receive(receivePacket);} catch (Exception e) {e.printStackTr
25、ace();} //從客戶端接收到請(qǐng)求</p><p> String sentence = new String(receivePacket.getData());</p><p> InetAddress IPAddress = receivePacket.getAddress(); //獲得client端的ip</p><p>
26、 int port = receivePacket.getPort(); //獲得client端的port</p><p> long randomTime = (long) (Math.random() * 1000); //生成隨機(jī)數(shù),用于模擬傳輸延遲</p><p> try {Thread.sleep(random
27、Time);} catch (InterruptedException e) {e.printStackTrace();} //程度睡眠,用于模擬傳輸延遲</p><p> if(sentence.substring(7,8).equals("1")&&!sentence.substring(7,9).equals("10")){</p
28、><p> cilentCount++; System.out.println("***********************************************");</p><p> System.out.println("* 第 "+cilentCount+" 臺(tái)客戶端機(jī)正在請(qǐng)求?。。。。?*&qu
29、ot;);</p><p> System.out.println("***********************************************\n");</p><p> }System.out.println("從客戶端接收到的信息為:");</p><p> System.out.println
30、("@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@");</p><p> System.out.println(sentence);sendData = sentence.getBytes(); </p><p> DatagramPa
31、cket sendPacket = new DatagramPacket(sendData, sendData.length, IPAddress, port); //生成數(shù)據(jù)包</p><p> try {serverSocket.send(sendPacket);} catch (Exception e) {e.printStackTrace();} //發(fā)回client端}</p&g
32、t;<p> }.start();</p><p> 六.開(kāi)發(fā)過(guò)程中遇到的問(wèn)題及解決辦法</p><p> 1. 問(wèn)題:在編寫(xiě)程序的過(guò)程中,因?yàn)閷?duì)socket編程不了解,導(dǎo)致不能正確讓客戶端和服務(wù)器端相互發(fā)送消息。</p><p> 解決:網(wǎng)上查詢socket相關(guān)的編程知識(shí),調(diào)用java JDK中java.net包下的DatagramSocke
33、t和DatagramPacket類,實(shí)現(xiàn)客戶端和服務(wù)器端的信息交流。</p><p> 2.問(wèn)題:剛開(kāi)始編程時(shí),服務(wù)器端不能服務(wù)多個(gè)客戶端。</p><p> 解決:通過(guò)多線程編程,使不同客戶端的請(qǐng)求運(yùn)行在不同的線程,來(lái)實(shí)現(xiàn)服務(wù)器端對(duì)多個(gè)客戶端的請(qǐng)求服務(wù)。</p><p> 七.程序中待解決的問(wèn)題及改進(jìn)方向</p><p> 1.待解
34、決的問(wèn)題:程序界面不過(guò)人性化。</p><p> 改進(jìn)方向:繼續(xù)深入優(yōu)化</p><p><b> 八.程序測(cè)試結(jié)果</b></p><p><b> 客戶端請(qǐng)求</b></p><p><b> 服務(wù)器端回復(fù)</b></p><p><b
35、> 以下為完整代碼</b></p><p><b> 客戶端代碼</b></p><p> import java.io.BufferedReader;</p><p> import java.io.InputStreamReader;</p><p> import java.io.Str
36、ingReader;</p><p> import java.net.DatagramPacket;</p><p> import java.net.DatagramSocket;</p><p> import java.net.InetAddress;</p><p> import java.text.SimpleDateF
37、ormat;</p><p> import java.util.Date;</p><p> /*PingClient,客戶端,有以下功能</p><p> 3.1啟動(dòng)后發(fā)送10個(gè)request。發(fā)送一個(gè)request后,最多等待1秒以便接收PingServer返回的reply消息。</p><p> 如果在該時(shí)間內(nèi)沒(méi)有收到服務(wù)器的
38、reply,則認(rèn)為該請(qǐng)求或?qū)υ撜?qǐng)求的reply已經(jīng)丟失;在收到reply后立即發(fā)送下一個(gè)request。</p><p> 3.2請(qǐng)求消息的payload中至少包含關(guān)鍵字PingUDP、序號(hào)、時(shí)間戳等內(nèi)容。如:PingUDP SequenceNumber TimeStamp CRLF</p><p> 其中:CRLF表示回車換行符(0X0D0A);TimeStamp為發(fā)送該消息的機(jī)器時(shí)
39、間。</p><p> 3.3為每個(gè)請(qǐng)求計(jì)算折返時(shí)間(RTT),統(tǒng)計(jì)10個(gè)請(qǐng)求的平均RTT、最大/小RTT。</p><p> 3.4通過(guò)如下命令行啟動(dòng):java PingClient host port。</p><p> host為PingServer所在的主機(jī)地址;port為PingServer的工作端口號(hào)</p><p><
40、;b> */</b></p><p> public class PingClient</p><p><b> {</b></p><p> public static void main(String[] args) throws Exception</p><p><b> {
41、</b></p><p> String address = args[0]; //從命令行獲得server ip地址</p><p> int port = new Integer(args[1]);
42、 //從命令行獲得端口號(hào)</p><p> long[] rtt = new long[10]; //用于折返時(shí)間的統(tǒng)計(jì)</p><p> System.out.println("\n客戶端啟動(dòng),開(kāi)始發(fā)送請(qǐng)求?。。?!\n\n\n");</p><p>
43、 for (int i = 1; i <= 10; i++) //發(fā)送10條請(qǐng)求</p><p><b> {</b></p><p> SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd h
44、h:mm:ss.SS"); //時(shí)間戳格式</p><p> String sentence = "頭部: 請(qǐng)求 " + i + " \n"//請(qǐng)求數(shù)據(jù)</p><p> + "payload:PingUDP 序號(hào):" + i + " 時(shí)間戳:"</p>
45、<p> + sdf.format(new Date())+"\n@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@";</p><p> DatagramSocket clientSocket = new DatagramSocket(); //生成client端socket實(shí)例</p>
46、<p> InetAddress IPAddress = InetAddress.getByName(address); //生成ip地址實(shí)例</p><p> byte[] sendData = new byte[1024]; //用于接收數(shù)據(jù)的byte數(shù)組</p><p> byte[
47、] receiveData = new byte[1024]; //用于發(fā)送數(shù)據(jù)的byte數(shù)組</p><p> sendData = sentence.getBytes();</p><p> DatagramPacket sendPacket = new DatagramPacket(sendData, sen
48、dData.length, IPAddress, port);//生成發(fā)送數(shù)據(jù)包</p><p> Date sendBefore = new Date(); //發(fā)送前時(shí)間</p><p> clientSocket.send(sendPacket);
49、 //發(fā)送</p><p> DatagramPacket receivePacket = new DatagramPacket(receiveData,receiveData.length);//生成接收數(shù)據(jù)包</p><p> clientSocket.receive(re
50、ceivePacket); //接收從server返回的數(shù)據(jù)包</p><p> Date receiveAfter = new Date(); //接收后的時(shí)間 <
51、;/p><p> //最多等待1秒以便接收PingServer返回的reply消息。如果在該時(shí)間內(nèi)沒(méi)有收到服務(wù)器的reply,則認(rèn)為該請(qǐng)求或?qū)υ撜?qǐng)求的reply已經(jīng)丟失</p><p> String modifiedSentence = "";</p><p> if(receiveAfter.getTime() - sendBefore.g
52、etTime()>1000){</p><p> modifiedSentence = "請(qǐng)求 "+i+" 超過(guò)1秒,模擬數(shù)據(jù)丟失??!";</p><p> rtt[i - 1] = (long) 0;
53、 //當(dāng)收不到reply時(shí),置折返時(shí)間為0,不加入計(jì)算</p><p><b> }else{</b></p><p> modifiedSentence = new String(receivePacket.getData());</p><p> rtt[i - 1] = receiveAfter.getTime() - sen
54、dBefore.getTime();</p><p><b> }</b></p><p> System.out.println("折返時(shí)間和服務(wù)端的返回信息為:");</p><p> System.out.println("@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
55、@@@@@@@@@@@@@@@");</p><p> System.out.println("折返時(shí)間(RTT):" + rtt[i - 1]);</p><p> System.out.println(modifiedSentence); //顯示從server返
56、回的數(shù)據(jù)</p><p> if(rtt[i - 1]==0){</p><p> System.out.println("@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@\n\n\n\n\n\n");</p><p><b> }</b></p>
57、<p> clientSocket.close(); //關(guān)閉socket</p><p><b> }</b></p><p> //統(tǒng)計(jì)出平均rtt,最大rtt和最小rtt</p><p>
58、long sumRtt = 0;</p><p> long maxRtt = 0;</p><p> long k = 0;</p><p> long minRtt = rtt[0];</p><p> int j = 0;</p><p> for (int i = 0; i < 10; i++)
59、</p><p><b> { </b></p><p> if(rtt[i] > k){</p><p> if (rtt[i] > maxRtt)</p><p><b> {</b></p><p> maxRtt = rtt[i];</
60、p><p><b> }</b></p><p> if (rtt[i] < minRtt)</p><p><b> {</b></p><p> minRtt = rtt[i];</p><p><b> }</b></p>
61、<p><b> j++;</b></p><p> sumRtt += rtt[i];}</p><p><b> }</b></p><p> System.out.println("最終折返時(shí)間為:"); </p><p> System.out.pr
62、intln("@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@");</p><p> System.out.println("平均折返時(shí)間: " + sumRtt / j +"ms");</p><p> System.out.println("最大折返時(shí)間
63、: " + maxRtt+"ms");</p><p> System.out.println("最小折返時(shí)間: " + minRtt+"ms");</p><p> System.out.println("@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
64、@@@");</p><p><b> }</b></p><p><b> }</b></p><p><b> 服務(wù)端代碼</b></p><p> import java.io.BufferedReader;</p><p>
65、import java.io.InputStreamReader;</p><p> import java.net.DatagramPacket;</p><p> import java.net.DatagramSocket;</p><p> import java.net.InetAddress;</p><p><b&g
66、t; /**</b></p><p> * Ping Server服務(wù)器端,完成以下功能</p><p> * 2.1 可以并發(fā)地為多個(gè)用戶服務(wù);</p><p> 2.2 顯示用戶通過(guò)客戶端發(fā)送來(lái)的消息內(nèi)容(包含頭部和payload);</p><p> 2.3 能夠模擬分組的丟失;能夠模擬分組傳輸延遲;</p&
67、gt;<p> 2.4 將用戶發(fā)送來(lái)的請(qǐng)求request在延遲一段隨機(jī)選擇的時(shí)間(小于1s)后返回給客戶端,作為收到請(qǐng)求的響應(yīng)reply;</p><p> 2.5 通過(guò)如下命令行啟動(dòng)服務(wù)器:java PingServer port。</p><p> port為PingServer的工作端口號(hào)</p><p><b> */<
68、/b></p><p> public class PingServer</p><p><b> {</b></p><p> public static void main(String[] args) throws Exception</p><p><b> {</b><
69、/p><p> System.out.println("\n服務(wù)端啟動(dòng),等待客戶端請(qǐng)求.......\n\n\n");</p><p> int initPort = new Integer(args[0]); //從命令行獲得port args[0]</p><p> DatagramSocket serverSocket
70、= new DatagramSocket(initPort); //根據(jù)port,生成server端socket實(shí)例</p><p> byte[] receiveData = new byte[1024];</p><p><b> /*</b></p><p> * 使用多線程編程,可以實(shí)現(xiàn)多個(gè)客戶端同時(shí)請(qǐng)求服務(wù)端<
71、/p><p><b> */</b></p><p> new Thread(){</p><p><b> @Override</b></p><p> public void run() {</p><p> int cilentCount = 0; //客戶端的數(shù)
72、量(多個(gè)客戶端)</p><p> //服務(wù)器端一直處于接收狀態(tài)</p><p> while (true)</p><p><b> {</b></p><p> byte[] sendData = new byte[1024];</p><p> DatagramPacket rec
73、eivePacket = new DatagramPacket(receiveData, receiveData.length);//生成接收數(shù)據(jù)報(bào)包實(shí)例</p><p> try {serverSocket.receive(receivePacket);} catch (Exception e) {e.printStackTrace();} //從客戶端接收到請(qǐng)求</p>
74、<p> String sentence = new String(receivePacket.getData());</p><p> InetAddress IPAddress = receivePacket.getAddress(); //獲得client端的ip</p><p> int port
75、 = receivePacket.getPort(); //獲得client端的port</p><p> long randomTime = (long) (Math.random() * 1000); //生成隨機(jī)數(shù),用于模擬傳輸延遲</p><p>
76、 try {Thread.sleep(randomTime);} catch (InterruptedException e) {e.printStackTrace();} //程度睡眠,用于模擬傳輸延遲</p><p> if(sentence.substring(7,8).equals("1")&&!sentence.substring(7,9).equal
77、s("10")){</p><p> cilentCount++;</p><p> System.out.println("***********************************************");</p><p> System.out.println("* 第 &q
78、uot;+cilentCount+" 臺(tái)客戶端機(jī)正在請(qǐng)求?。。。?! *");</p><p> System.out.println("***********************************************\n");</p><p><b> }</b></p><p>
79、 System.out.println("從客戶端接收到的信息為:");</p><p> System.out.println("@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@");</p><p> System.out.println(sentence);</p>
80、<p> sendData = sentence.getBytes(); </p><p> DatagramPacket sendPacket = new DatagramPacket(sendData, sendData.length, IPAddress, port); //生成數(shù)據(jù)包</p>
81、<p> try {serverSocket.send(sendPacket);} catch (Exception e) {e.printStackTrace();} //發(fā)回client端</p><p><b> }</b></p><p><b> }</b></p><p> }
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 計(jì)算機(jī)網(wǎng)絡(luò)課程設(shè)計(jì)-----基于icmp的ping設(shè)計(jì)
- 計(jì)算機(jī)網(wǎng)絡(luò)基礎(chǔ)課程設(shè)計(jì)--ping程序的實(shí)現(xiàn)
- 《計(jì)算機(jī)網(wǎng)絡(luò)基礎(chǔ)課程設(shè)計(jì)》udp
- 計(jì)算機(jī)網(wǎng)絡(luò)課程設(shè)計(jì)
- 計(jì)算機(jī)網(wǎng)絡(luò)課程設(shè)計(jì)
- 計(jì)算機(jī)網(wǎng)絡(luò)課程設(shè)計(jì)
- 《計(jì)算機(jī)網(wǎng)絡(luò)課程設(shè)計(jì)》
- 計(jì)算機(jī)網(wǎng)絡(luò)課程設(shè)計(jì)
- 計(jì)算機(jī)網(wǎng)絡(luò)課程設(shè)計(jì)
- 計(jì)算機(jī)網(wǎng)絡(luò)課程設(shè)計(jì)
- 計(jì)算機(jī)網(wǎng)絡(luò)課程設(shè)計(jì)
- 計(jì)算機(jī)網(wǎng)絡(luò)編程課程設(shè)計(jì)-- 24分游戲
- 計(jì)算機(jī)網(wǎng)絡(luò)編程課程設(shè)計(jì)-- 猜數(shù)游戲
- 計(jì)算機(jī)網(wǎng)絡(luò)編程24分游戲課程設(shè)計(jì)
- 計(jì)算機(jī)網(wǎng)絡(luò)課程設(shè)計(jì)---網(wǎng)絡(luò)設(shè)計(jì)
- 計(jì)算機(jī)網(wǎng)絡(luò)課程設(shè)計(jì)報(bào)告
- 計(jì)算機(jī)網(wǎng)絡(luò)課程設(shè)計(jì)報(bào)告
- 計(jì)算機(jī)網(wǎng)絡(luò)課程設(shè)計(jì)報(bào)告
- 計(jì)算機(jī)網(wǎng)絡(luò)組建課程設(shè)計(jì)
- 計(jì)算機(jī)網(wǎng)絡(luò)課程設(shè)計(jì)報(bào)告
評(píng)論
0/150
提交評(píng)論