广工计算机网络课设——基于UDP的ping.doc_第1页
广工计算机网络课设——基于UDP的ping.doc_第2页
广工计算机网络课设——基于UDP的ping.doc_第3页
广工计算机网络课设——基于UDP的ping.doc_第4页
广工计算机网络课设——基于UDP的ping.doc_第5页
已阅读5页,还剩15页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

计算机网络课程设计 学 院_ _计算机学院_专 业_软件工程_ 年级班别_12级4班_学 号 3112006291 学生姓名_ 林炳城_ _ _指导教师_ 梁路 _成 绩 目录一、设计环境5二、课程设计的目的5三、理论基础5四、基本要求6五、设计思想6六、源程序7七、测试用例13八、总结17九、附带半成品作业截图18计算机网络课程设计任务书设计题目编程实现基于UDP的PING (Java)已知技术参数和设计要求1.编程实现PING的服务器端和客户端,实现操作系统提供的ping命令的类似功能。2.服务器端PingServer功能:2.1 可以2.2 显示用户通过客户端发送来的消息内容(包含头部和payload);2.3 能够模拟分组的丢失;能够模拟分组传输延迟;2.4 将用户发送来的请求request在延迟一段随机选择的时间(小于1s)后返回给客户端,作为收到请求的响应reply; 2.5 通过如下命令行启动服务器:java PingServer port。 port为PingServer的工作端口号3.客户端PingClient功能:3.1启动后发送10个request。发送一个request后,最多等待1秒以便接收PingServer返回的reply消息。如果在该时间内没有收到服务器的reply,则认为该请求或对该请求的reply已经丢失;在收到reply后立即发送下一个request。3.2请求消息的payload中至少包含关键字PingUDP、序号、时间戳等内容。如:PingUDP SequenceNumber TimeStamp CRLF 其中:CRLF表示回车换行符(0X0D0A);TimeStamp为发送该消息的机器时间。3.3 为每个请求计算折返时间(RTT),统计10个请求的平均RTT、最大/小RTT。3.4 通过如下命令行启动:java PingClient host port。 host为PingServer所在的主机地址;port为PingServer的工作端口号设计内容与步骤1.学习ICMP,了解ping命令的工作机理;2.学习Java UDP Socket通信机制;3.了解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.7IDE:eclipse二、课程设计的目的 本次课程设计的目的在掌握计算机网络理论的基础上,了解网络技术,掌握计算机网络相关设计方法和思想,希望能通过本次的课程设计,达到巩固和综合应用计算机网络原理和知识,本次课程设计主要是编程实现基于UDP的ping,使用java语言编程,编写一个实验程序、仿真模拟Ping命令,通过观察实验结果,从而判定本次程序设计是否成功完成任务。三、理论基础3.1 UDP简介UDP 是User Datagram Protocol的简称, 中文名是用户数据包协议,是OSI(Open System Interconnection,开放式系统互联) 参考模型中一种无连接的传输层协议,提供面向事务的简单不可靠信息传送服务,IETF RFC 768是UDP的正式规范。UDP在IP报文的协议号是17。UDP协议全称是用户数据报协议1 ,在网络中它与TCP协议一样用于处理数据包,是一种无连接的协议。在OSI模型中,在第四层传输层,处于IP协议的上一层。UDP有不提供数据包分组、组装和不能对数据包进行排序的缺点,也就是说,当报文发送之后,是无法得知其是否安全完整到达的。UDP用来支持那些需要在计算机之间传输数据的网络应用。包括网络视频会议系统在内的众多的客户/服务器模式的网络应用都需要使用UDP协议。UDP协议从问世至今已经被使用了很多年,虽然其最初的光彩已经被一些类似协议所掩盖,但是即使是在今天UDP仍然不失为一项非常实用和可行的网络传输层协议。与所熟知的TCP(传输控制协议)协议一样,UDP协议直接位于IP(网际协议)协议的顶层。根据OSI(开放系统互连)参考模型,UDP和TCP都属于传输层协议。UDP协议的主要作用是将网络数据流量压缩成数据包的形式。一个典型的数据包就是一个二进制数据的传输单位。每一个数据包的前8个字节用来包含报头信息,剩余字节则用来包含具体的传输数据。3.2 ping简介Ping是Windows下的一个命令在Unix和Linux下也有这个命令。ping也属于一个通信协议,是TCP/IP协议的一部分。利用“ping”命令可以检查网络是否连通,可以很好地帮助我们分析和判定网络故障。应用格式:Ping空格IP地址。该命令还可以加许多参数使用,具体是键入Ping按回车即可看到详细说明。PING (Packet Internet Groper),因特网包探索器,用于测试网络连接量的程序。Ping发送一个ICMP(Internet Control Messages Protocol)即因特网信报控制协议;回声请求消息给目的地并报告是否收到所希望的ICMP echo (ICMP回声应答)。它是用来检查网络是否通畅或者网络连接速度的命令。作为一个生活在网络上的管理员或者黑客来说,ping命令是第一个必须掌握的DOS命令,它所利用的原理是这样的:利用网络上机器IP地址的唯一性,给目标IP地址发送一个数据包,再要求对方返回一个同样大小的数据包来确定两台网络机器是否连接相通,时延是多少。ping指的是端对端连通,通常用来作为可用性的检查, 但是某些病毒木马会强行大量远程执行ping命令抢占你的网络资源,导致系统变慢,网速变慢。严禁ping入侵作为大多数防火墙的一个基本功能提供给用户进行选择。通常的情况下你如果不用作服务器或者进行网络测试,可以放心的选中它,保护你的电脑。四、基本要求4.1 编程实现PING的服务器端和客户端,实现操作系统提供的ping命令的类似功能。4.2 服务器端PingServer功能:4.2.1 可以2.2 显示用户通过客户端发送来的消息内容(包含头部和payload);4.2.3 能够模拟分组的丢失;能够模拟分组传输延迟;4.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中至少包含关键字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模型中,在第四层-传输层,处于IP协议的上一层,UDP有不提供数据报分组、组装和不能对数据包的排序的缺点,也就是说,当报文发送之后,是无法得知是否安全完整的到达目的地。这个课设通过调用java JDK中包下的DatagramSocket和DatagramPacket类,可以实现对用户数据报文的控制,DatagramSocket类用于创建接收和发送UDP的Spcket实例,调用DatagramPacket类用于处理报文,因为它可以将Byte数组、目标地址、目标端口等数据包装成报文或者将报文拆卸成Byte数组。通过调用DatagramSocket和DatagramPacket类来实现操作系统提供的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中包含有关键字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 .SocketException;/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) this.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.nextInt(); / 获取端口porttry / 根据输入的监听端口生成server端DatagramSocket实例serverSocket = new DatagramSocket(initPort); catch (SocketException e1) / 捕获到此异常一般是输入的端口非法,或者被占用System.out.println(监听端口 + initPort+ 失败,端口非法或已被占用,请重新启动输入其他有效空闲端口);e1.printStackTrace();System.exit(0);/ 中止程序/ 死循环,不断的监听是否有请求数据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(serverSocket, receivePacket);/ 到此步说明有新的请求了,此时生成一个新的服务线程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处理多用户请求的对各个线程的 * author LinBingcheng */class ServerThread extends Thread private DatagramPacket receivePacket; / 接受到的数据分组private DatagramSocket serverSocket; / 数据包套接字public ServerThread(DatagramSocket serverSocket,DatagramPacket receivePacket) this.receivePacket = receivePacket;this.serverSocket = serverSocket;Overridepublic 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,模拟数据包丢失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数组,用于发回客户端DatagramPacket 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 setReceivePacket(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 .DatagramSocket;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为键盘)String host = args0; /scanner.nextLine(); / 获取服务器端所在的主机地址int port = Integer.valueOf(args1);/scanner.nextInt(); / 获取服务器端监听的端口号Long rtt = new Long10; / 用于存储rtt,用于最后的统计for (int i = 1; i 1000) /如果接收时间大约1000ms,视为数据包丢失rtti - 1 = (long) 1000;receiveSentence = data losen;System.out.println(receiveSentence);/显示从server返回的数据端System.out.println(rtt: + rtti - 1); / 显示rttclientSocket.close(); / 关闭socket/ 统计出平均rtt,最大rtt和最小rttlong sumRtt = 0;long maxRtt = 0;long minRtt = rtt0;for (int i = 0; i maxRtt) maxRtt = rtti;if (rtti minRtt) minRtt = rtti;sumRtt += rtti;System.out.println(average rtt: + sumRtt / 10 + millisecond);System.out.println(max rtt: + maxRtt);System.out.println(min rtt: + minRtt);七、测试用例7.1 按 “win + R” 键,在弹出的对话框中输入“cmd”回车,如下:7.2通过“cd”命令,进入源程序所在目录7.3输入“javac PingClient.java”命令,编译PingClient.java程序 输入“javac PingServer.java”命令,编译PingServer.java程序 在相同目录下生成两个可执行文件(没有报错说明编译成功)7.4测试程序将class文件复制到简单易读取的位置此时需要启动PingServer和启动PingClient,打开两个命令行,通过“cd”进入到文件存放目录 输入测试执行命令:java PingServer 9999 (9999是端口号可以是任意的) java PingClient localhost 9999 (localhost代表本机,即)命令进行启动,并发送10个请求,请求信息payload包括了PingUDP、 SequenceNumber 、TimeStamp的内容,以及每个请求的折返时间,并统计10个请求的平均RTT以及最大RTT和最小RTT,此时PingClient客户端收到PingServer服务器的返回信息显示如下: 7.4.1 PingServer输出结果如下7.4.2 PingClie

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论