版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、计算机网络课程设计学院计算机学院专业软件工程年级班别忸4班学 号 3112006291学生姓名 林炳城指导教师梁路成 绩目录一、设计环境4二、课程设计的目的 4三、理论基础4四、基本要求5五、设计思想6六、源程序7七、测试用例1.3八、总结1.7.九、附带半成品作业截图 18.计算机网络课程设计任务书设计题目编程实现基于 UDP的PING (Java)1.编程实现PING的服务器端和客户端,实现操作系统提供的ping命令的类似功能。2.服务器端PingServer功能:2.1可以2.2显示用户通 过客户 端发 送来的消息 内容(包含头 部和payload);2.3能够模拟分组的丢失;能够模拟分
2、组传输延迟;2.4将用户发送来的请求request在延迟一段随机选择的时间(小于1s)后返回给客户端,作为收到请求的响应reply ;2.5通过如下命令行启动服务器:java PingServer port 。port为PingServer的工作端口号已知技术参3.客户端PingClient功能:3.1 启动后发送10个request。发送一个request后,最多等待1秒以便接必科反U要 求收PingServer返回的reply消息。如果在该时间内没有收到服务器的 reply ,则认为该请求或对该请求的reply已经丢失;在收到reply后立.即发送下一个request。3.2请求消息的pa
3、yload中至少包含关键字 PingUDP、序号、时间戳等内容。如:PingUDP SequenceNumber TimeStamp CRLF其中:CRLF表示回车换行符(0X0D0A); TimeStamp为发送该消息的机器时间。3.3为每个请求计算折返时间(RTT),统计10个请求的平均 RTT、最大/小RII。3.4通过如下命令行启动:java PingClient host port 。host为PingServer所在的主机地址;port为PingServer的工作端口号1.学习ICMP, 了解ping命令的工作机理;2.学习Java UDP Socket通信机制;设计内容与3.了解
4、Java多线程程序设计;步骤4.服务器PingServer程序设计;5.客户端PingClient程序设计。6.调试与演示1.ping命令工作机制学习2小时2.Java UDP Socket通信机制2小时设计工作计3.Java多线程程序设计4小时4.PingServer程序设计6小时划与进度安5.PingClient程序设计12小排时6.调试与演示4小时6.课程设计说明书10小时、设计环境操作系统:win8开发环境:JDK1.7 IDE: eclipse二、课程设计的目的本次课程设计的目的在掌握计算机网络理论的基础上,了解网络技术,掌 握计算机网络相关设计方法和思想, 希望能通过本次的课程设计
5、,达到巩固和综 合应用计算机网络原理和知识,本次课程设计主要是编程实现基于 UDP的ping , 使用java语言编程,编写一个实验程序、仿真模拟 Ping命令,通过观察实验结 果,从而判定本次程序设计是否成功完成任务。三、理论基础3.1 UDP简介UDP是User Datagram Protocol的简称, 中文名是用户数据包协议,是 OSI (Open System Interconnection ,开放式系统互联)参考模型中一种无连接的传输层协议,提供面向事务的简单不可靠信息传送服务,IETF RFC 768是UDP的正式规范。UDP在IP报文的协议号是17。UDP协议全称是用户数据报协
6、议 1,在网络中它与TCP协议一样用于处理数据包,是一种无连接的协议。在 OSI模型中,在第四层 传输层,处于IP协议的上一层。UDP有 不提供数据包分组、 组装和不能对数据包进行排序的缺点,也就是说,当报文发送之后,是无法得知其是否安全完整到达的。UDP用来支持那些需要在计算机之间传输数据的网络应用。包括网络视频会议系统在内的众多的客户/服务器模式的网络应用都需要使用UDP协议。UDP协议从问世至今已经被使用了很多年,虽然其最初的光彩已经被一些类似协议所掩盖, 但是即使是在今天 UDP仍然不失为一项非常实用和可行的网络传输层协议。与所熟知的TCP (传输控制协议)协议一样,UDP协议直接位于
7、IP (网际协议)协议的顶层。根据 OSI (开放系统互连)参考模型,UDP和TCP都属于传输层协议。UDP协议的主要作用是将网络数据流量压缩成数据包的形式。一个典型的数据包就是一个二进制数据的传输单位。每一个数据包的前8个字节用来包含报头信息,剩余字节则用来包含具体的传输数据。3.2 ping 简介Ping是 Windows下的一个命令在 Unix和Linux下也有这个命令。ping也属于一个通信 协议,是TCP/IP协议的一部分。利用ping ”命令可以检查网络是否连通,可以很好地帮助我们分析和判定网络故障。应用格式:Ping空格IP地址。该命令还可以加许多参数使用,具体是键入Ping按回
8、车即可看到详细说明。PING (Packet Internet Groper),因特网包探索器,用于测试网络连接量的程序。Ping发送一个ICMP(Internet Control Messages Protocol )即因特网信报控制协议;回声请求消息给目的地并报告是否收到所希望的ICMP echo (ICMP回声应答)。它是用来检查网络是否通畅或者网络连接速度的命令。作为一个生活在网络上的管理员或者黑客来说,ping命令是第一个必须掌握的 DOS命令,它所利用的原理是这样的:利用网络上机器IP地址的唯一性,给目标IP地址发送一个数据包,再要求对方返回一个同样大小的数据包来确定两台网络机 器
9、是否连接相通,时延是多少。ping指的是端对端连通,通常用来作为可用性的检查,但是某些病毒木马会强行大量远程执行ping命令抢占你的网络资源,导致系统变慢,网速变慢。严禁 ping入侵作为大多 数防火墙的一个基本功能提供给用户进行选择。通常的情况下你如果不用作服务器或者进行网络测试,可以放心的选中它,保护你的电脑。四、基本要求4.1 编程实现PING的服务器端和客户端,实现操作系统提供的ping命令的类似功能。4.2 服务器端 PingServer功能:4.2.1 可以2.2显示用户通过客户端发送来的消息内容(包含头部和payload);4.2.3 能够模拟分组的丢失;能够模拟分组传输延迟;4
10、.2.4 将用户发送来的请求request在延迟一段随机选择的时间(小于1s)后返回给客户端作为收到请求的响应reply ;4.2.5 通过如下命令行启动服务器:java PingServer port 。port为PingServer的工作端口号4.3 客户端PingClient功能:4.3.1 启动后发送10个request。发送一个request后,最多等待1秒以便接收 PingServer返回的reply消息。如果在该时间内没有收到服务器的reply ,则认为该请求或对该请求的reply已经丢失;在收到reply后立即发送下一个request。4.3.2 请求消息的payload中至少
11、包含关键字 PingUDP、序号、时间戳等内容。如: PingUDP SequenceNumber TimeStamp CRLF 其中:CRLF表示回车换行符 (0X0D0A); TimeStamp为发送该消息的机器时间。4.3.3 为每个请求计算折返时间(RTT),统计10个请求的平均 RTT、最大/小RTT。4.3.4 通过如下命令行启动:java PingClient host port 。host为PingServer所在的主机地址 port为PingServer的工作端口号五、设计思想UDP协议的全称是用户数据报,在网络中它与TCP协议一样用于处理数据包,在OSI模型中,在第四层-传
12、输层,处于IP协议的上一层,UDP有不提供数据报分组、 组装和不能对数据包的排序的缺点,也就是说,当报文发送之后,是无法得知是否安全完整的到达目的地。这个课设通过调用 java JDK 中 包下的 DatagramSocket 和 DatagramPacket 类,可以实现对用户数据报文的控制,DatagramSocket类用于创建接收和发送 UDP的Spcket实例,调用DatagramPacket类用于处理报文,因为它可以将 Byte数组、目标地 址、目标端口等数据包装成报文或者将报文拆卸成Byte数组。通过调用 DatagramSocket和DatagramPacket类来实现操作系统提
13、供的ping命令的类似功能。编程实现基于UDP的ping的思想可以概括为几点:5.1 服务器端 PingServer功能:5.1.1 可以并发地为多个用户服务;5.1.2 显示用户通过客户端发送来的消息内容(包含头部和payload);5.1.3 将用户发送来的请求在延迟一段时间后返回给客户端,作为收到请求的相应。5.1.4 通过java PingServer 9999 (端口号可以任意选择)命令行来启动服务器。5.2 客户端PingClient功能:5.2.1 启动都发送10个请求,发送一个请求后,最多等待1秒以便接收PingServer返回的响应消息。5.2.2 请求消息的payload中
14、包含有关键字 PingUDP、序号、时间戳等内容。5.2.3 为每个请求计算折返时间(RTT),统计10个请求的平均 RTT、min/max的RTT。5.2.4 通过 java PingClient localhost (本机 IP 地址)9999 命令行启动。5.3 程序设计流程图根据课程设计的要求,结合程序设计流程,本次设计按如下的流程进行六、源程序6.1 服务器端代码import java.io.IOException;import .DatagramPacket;import .DatagramSocket;import .InetAddress;import .SocketExcep
15、tion;/import java.util.Scanner;/*服务器端* author LinBingcheng*/public class PingServer extends Thread private int initPort; /监听的端口号数据包套接字接受到的数据分组数据包使用的缓冲区private DatagramSocket serverSocket; / private DatagramPacket receivePacket; /private byte口 buffer = new byte1024; /public PingServer(int initPort) t
16、his.initPort = initPort;public void run() System.out.println("编程实现基于 UDP 的 PING (Java)服务端");System.out.println("PING SERVER STARTED");/ System.out.print("请输入监听的端口号:");/ Scanner scanner = new Scanner(System.in);/接收从系统指定输入方式输入的数据(默认 System.in为键盘)/ int initPort = scanner.n
17、extInt(); 获取端口 port try /根据输入的监听端口生成server端DatagramSocket实例serverSocket = new DatagramSocket(initPort); catch (SocketException e1) /捕获到此异常一般是输入的端口非法,或者被占用System.out.println("监听端口 " + initPort+ "失败,端口非法或已被占用,请重新启动输入其他有效空闲端口 ");e1.printStackTrace();System.exit(0);/ 中止程序/死循环,不断的监听是否
18、有请求数据while (true) receivePacket = new DatagramPacket(buffer, buffer.length); /生成接收数据报包实例/监听是否有用户发出新的request连接到PingServer/程序会陷入到该语句,知道有新的连接产生try serverSocket.receive(receivePacket); catch (IOException e) System.out.println("分组接受异常");e.printStackTrace();ServerThread thread = new ServerThread
19、(serverSocket, receivePacket);/至 U 止匕步说明有新的请求了,此时生成一个新的服务线程thread.start();/ 启动线程Overridepublic void destroy。 serverSocket.close();/ 回收资源public static void main(String口 args) throws Exception PingServer pingServer = new PingServer(Integer.valueOf(args0);初始化服务器pingServer.start();/* PingServer处理多用户请求的对
20、各个线程的* author LinBingcheng* /class ServerThread extends Thread private DatagramPacket receivePacket; /接受到的数据分组private DatagramSocket serverSocket; / 数据包套接字public ServerThread(DatagramSocket serverSocket, DatagramPacket receivePacket) this.receivePacket = receivePacket;this.serverSocket = serverSocke
21、t;Override public void run() byte buffer = new byte4096; / 数据使用的缓冲区long randomTime = (long) (Math.random() * 2000); /到此步说明接收到新连接,在此生成随机数,模拟传输延迟String sentence = null;/ 接收到的数据try sleep(randomTime);/休眠睡眠,用于模拟传输延迟 catch (InterruptedException e) e.printStackTrace();if (randomTime > 1000) 如果随机数大于1000,
22、模拟数据包丢失sentence = "data losen" /数据丢失的信息 else sentence = (new String(receivePacket.getData().substring(0, 100);/ 将数据从 缓冲区轮换成字符串InetAddress host = receivePacket.getAddress(); /获取客户端的 ip 地址int port = receivePacket.getPort(); /获取客户端的通讯端口buffer = sentence.getBytes(); 请求数据转换成 byte数组,用于发回客户端Datag
23、ramPacket sendPacket = new DatagramPacket(buffer, buffer.length,host, port); /生成数据包,已经保存好发送目的地的地址和端口了try serverSocket.send(sendPacket);/发送数据给客户端 catch (Exception e) e.printStackTrace();System.out.println(sentence); /显示请求结果public DatagramPacket getReceivePacket() return receivePacket;public void setR
24、eceivePacket(DatagramPacket receivePacket) this.receivePacket = receivePacket;public DatagramSocket getServerSocket() return serverSocket;public void setServerSocket(DatagramSocket serverSocket) this.serverSocket = serverSocket;6.2客户端代码import java.io.IOException;import .DatagramPacket;import .Datagr
25、amSocket;import .InetAddress;import java.text.SimpleDateFormat;import java.util.Date;/import java.util.Scanner;/* 客户端* author LinBingcheng* /public class PingClient public static void main(String口 args) throws Exception / Scanner scanner = new Scanner(System.in);/ 接收从系统指定输入方式输入的数 据(默认System.in为键盘)St
26、ring host = args0; /scanner.nextLine(); / 获取服务器端所在的主机地址int port = Integer.valueOf(args1);scanner.nextInt(); /获取服务器端监听的端口Long口 rtt = new Long10; / 用于存储rtt ,用于最后的统计for (int i = 1; i <= 10; i+) /模拟发送 10 条请求SimpleDateFormat sdf = new SimpleDateFormat( "yyyy-MM-dd hh:mm:ss.SS"); /时间戳格式Date s
27、endBefore = new Date(); /记录发送前时间String sentence = "head: request " + i + " n" /模拟用的请求数据 + "playload: PingUDP SequenceNumber:" + i + " TimeStamp:" + sdf.format(sendBefore) + "n"DatagramSocket clientSocket = new DatagramSocket(); /生成客户端 DatagramSocket
28、实例InetAddress IPAddress = InetAddress.getByName(host); / 生成 ip 地址实例byte口 buffer = new byte1024; /数据包使用的缓冲区buffer = sentence.getBytes(); /将请求数据放进缓冲区内DatagramPacket sendPacket = new DatagramPacket(buffer, buffer.length, IPAddress, port); /生成发送数据包实例clientSocket.send(sendPacket); /发送到服务器端DatagramPacket
29、receivePacket = new DatagramPacket(buffer, buffer.length);/生成接收数据包实例try 接收从服务端返回的数据包clientSocket.receive(receivePacket); catch (IOException e) System.out.println("分组接受异常");e.printStackTrace();String receiveSentence = new String(receivePacket.getData(); / 将数据从缓 冲区轮换成字符串Date receiveAfter = n
30、ew Date(); /记录接收后的时间rtti - 1 = receiveAfter.getTime() - sendBefore.getTime(); 计算 rttif( rtti - 1 > 1000) 如果接收时间大约1000ms ,视为数据包丢失rtti - 1 = (long) 1000;receiveSentence = "data losen"System.out.println(receiveSentence);显示从 server 返回的数据端System.out.println("rtt:" + rtti - 1);/ 显示
31、rttclientSocket.close(); / 关闭 socket /统计出平均rtt,最大rtt和最小rttlong sumRtt = 0;long maxRtt = 0;long minRtt = rtt0;for (int i = 0; i < 10; i+) if (rtti > maxRtt) maxRtt = rtti;if (rtti < minRtt) minRtt = rtti;sumRtt += rtti;System.out.println("average rtt: " + sumRtt / 10 + " milli
32、second"); System.out.println("max rtt: " + maxRtt);System.out.println("min rtt: " + minRtt);七、测试用例7.1 按 win + R ”键,在弹出的对话框中输入“ cmd ”回车,如下:7.2 通过Cd”命令,进入源程序所在目录国C :Wi n d owssy stem 32t m d. exeMici'asoft Vindaus6.3.96001<c> Microsoft Carpcrat ion « 保留所用权利
33、6;C: SUsersXLinSirigichengJe :t : >cd E: woi'kspacejauaJauallDFP1 NGSsrcE: wa rkspaceXjauaJauaUrPFl NGXsrc>7.3 输入 javac PingClient.java ”命令,编译 PingClient.java 程序 输入javac PingServer.java ”命令,编译 PingServer.java 程序 在相同目录下生成两个可执行文件(没有报错说明编译成功)qqC:Wi nd ssy$te m 2 2c md. cxe“in加wu【近本 £ &qu
34、ot;96001<c> 2013 Mitir-usoft CuriAiratIon 0 保弱所有权利口C;UsersxLinBinqchenq>e:E ; S>cd E : wot*h<jpacp SjnvaJavaUVPTIrcE:workspacejau4SJavjiUBPPI hGrc>Javac FinCLient.javaE :Xj-aya LJaidiiilJPPPI NGvc福。PxinQ|Sei'eih B j引/小法:I*加亨为e<?.J"句交例期覆盖了已过山的AFI o 注:有美详匐信息.请使用-Klint:dep
35、recation重新编译电F:uovkspaceXjflUfliTfluallDPPf hCtvf:>-7.4 测试程序将class文件复制到简单易读取的位置此时需要启动 PingServer和启动PingClient ,打开两个命令行,通过"cd”进入到文件存 放目录输入测试执行命令:java PingServer 9999(9999是端口号可以是任意的)java PingClient localhost 9999 (localhost代表本机,即 127.0.0.1)命令进行启动,并发送10个请求,请求信息payload包括了 PingUDP、SequenceNumber
36、、TimeStamp的内容,以及每个请求的折返时间,并统计 10个请求的平 均RTT以及最大RTT和最小RTT,此时PingClient客户端收到PingServer服务器的返回信息 显示如下:7.4.1 PingServer输出结果如下S3C:Windows5/sterri32cmd,exe - iavd PingServer 99991iciLocoft Uindotfo_1版本 l .才968日1<u) 2013 Mluruffuf L Curpurdtluii > 保留所有权利6C: MJsep4LinBinsfcheng>e :|Ei S>cd binE:hl
37、n>jaa PinsfS*rver 9999 编程实现基干UDP的PIHC CJmQ服务惴 PIMC CERUER STARTED iIeIg lli>clie ad = request 2plaloafl : PinlIDP SediienceHiimbef:2 TimeStamii:2015-01-11 10i:35 :39.931卜七日dU requitisc 3plalaad: fintfUWP SequenceNLimber: TimeStanp:aIdlS-Ul-ll lM:3b :31 data loseFiead: request 6pJLa«/laad
38、- PinglJI)P £eq<us nceMumbei*. £ T imeStamp - 201£01-11 1&- 35 - 34 «9 80head: request 7pla9laad- Pin<UDP SequenceNumber-7 TimeStamp:2815-01-11 10:35:35.116Id Aid loeedata losehe ad - I'e(pnet 10plau/laad - FinLIDP ScquicnccHuiiTibci'= 10 TIncStcnps2015-01 -li 1
39、3:3S = 391297.4.2 PingClient 输出结果如下MJsers MinBin Qche ng >e :"cdS Bquenc eHunhek*TimeStamp:2015-01-11bin?,1CQ9 ,losertt:I59J«t«l JuildyloHil: PinglIDP SequenceNunhet': 710:35:35.116Tim&Scanp;2015-01-11Mjiit>J<ivd Piny Cl lent IjvdlliusC 9?99tt :1»MU ead,ft 2lauloatlx FlngUDPtt:LG03覆 ±3 loSilead: request 3其夕LomdU PinfUDPiead: request b laT/Loeitl : PlngllBPfeQuenceHunlbeauemaqc! tt 1 ' m<ix rtt : 10DE cad : I'eqLie st 167layloail: PinqUUP SequenEeNunher:13 IineStamu:201E01-11icrosoft L/indous 假车 &.3J6痴c> 2S13
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
评论
0/150
提交评论