版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、后面有完整代码计算机网络课程设计报告编程实现基于UDP的PING学 院 计算机学院 专 业 学 号学生姓名 指导教师 姜 2017年 6月 计算机网络课程设计一 程序开发的基础知识1. PING的相关知识Ping是Windows、Unix和Linux系统下的一个命令。ping也属于一个通信协议,是TCP/IP协议的一部分。利用“ping”命令可以检查网络是否连通,可以很好地帮助我们分析和判定网络故障。应用格式:Ping空格IP地址。PING (Packet Internet Groper),因特网包探索器,用于测试网络连接量的程序。Ping发送一个ICMP(Internet Control M
2、essages Protocol)即因特网信报控制协议;回声请求消息给目的地并报告是否收到所希望的ICMPecho (ICMP回声应答)。它是用来检查网络是否通畅或者网络连接速度的命令。作为一个生活在网络上的管理员或者黑客来说,ping命令是第一个必须掌握的DOS命令,它所利用的原理是这样的:利用网络上机器IP地址的唯一性,给目标IP地址发送一个数据包,再要求对方返回一个同样大小的数据包来确定两台网络机器是否连接相通,时延是多少。ping指的是端对端连通,通常用来作为可用性的检查, 但是某些病毒木马会强行大量远程执行ping命令抢占你的网络资源,导致系统变慢,网速变慢。严禁ping入侵作为大多
3、数防火墙的一个基本功能提供给用户进行选择。通常的情况下你如果不用作服务器或者进行网络测试,可以放心的选中它,保护你的电脑。2. UDP的相关知识UDP 是User Datagram Protocol的简称,全称是用户数据报协议 ,在网络中它与TCP协议一样用于处理数据包,是一种无连接的协议。在OSI模型中,在第四层传输层,处于IP协议的上一层。UDP有不提供数据包分组、组装和不能对数据包进行排序的缺点,也就是说,当报文发送之后,是无法得知其是否安全完整到达的。UDP用来支持那些需要在计算机之间传输数据的网络应用。包括网络视频会议系统在内的众多的客户/服务器模式的网络应用都
4、需要使用UDP协议。UDP协议从问世至今已经被使用了很多年,虽然其最初的光彩已经被一些类似协议所掩盖,但是即使是在今天UDP仍然不失为一项非常实用和可行的网络传输层协议。与所熟知的TCP(传输控制协议)协议一样,UDP协议直接位于IP(网际协议)协议的顶层。根据OSI(开放系统互连)参考模型,UDP和TCP都属于传输层协议。UDP协议的主要作用是将网络数据流量压缩成数据包的形式。一个典型的数据包就是一个二进制数据的传输单位。每一个数据包的前8个字节用来包含报头信息,剩余字节则用来包含具体的传输数据。3. Socket通信机制相关知识网络上的两个程序通过一个双向的通信连接实现数据的交换,这个连接
5、的一端称为一个socket。建立网络通信连接至少要一对端口号(socket)。socket本质是编程接口(API),对TCP/IP的封装,TCP/IP也要提供可供程序员做网络开发所用的接口,这就是Socket编程接口;HTTP是轿车,提供了封装或者显示数据的具体形式;Socket是发动机,提供了网络通信的能力。Socket的英文原义是“孔”或“插座”。作为BSD UNIX的进程通信机制,取后一种意思。通常也称作"套接字",用于描述IP地址和端口,是一个通信链的句柄,可以用来实现不同虚拟机或不同计算机之间的通信。在Internet上的主机一般运行了多个服务软件,同时提供几种服
6、务。每种服务都打开一个Socket,并绑定到一个端口上,不同的端口对应于不同的服务。Socket正如其英文原意那样,像一个多孔插座。一台主机犹如布满各种插座的房间,每个插座有一个编号,有的插座提供220伏交流电, 有的提供110伏交流电,有的则提供有线电视节目。 客户软件将插头插到不同编号的插座,就可以得到不同的服务。二 设计思路本程序是通过基于UDP的socket的网络编程,来实现客户端和服务器端的信息传输,包括客户端发送请求给服务器端、服务器端回应客户端,以致实现PING的效果。具体的思路是通过调用java JDK中包下的DatagramSocket和DatagramPacket类,可以实
7、现对用户数据报文的控制,DatagramSocket类用于创建接收和发送UDP的Socket实例,调用DatagramPacket类用于处理报文,因为它可以将Byte数组、目标地址、目标端口等数据包装成报文或者将报文拆卸成Byte数组。这样就可以实现客户端和服务器端的信息交流了。以此来达到ping的功能。再通过多线程编程的思想,让不同客户端的请求运行在不同的线程,来实现服务器端为多个客户端服务的功能。客户端服务器端三 程序流程图 开始回复请求接收请求信息等待客户端请求开始 循环10次请求收到回复折返时间RTT>1000ms 模拟请求丢失模拟请求丢失 四关键数据结构 本程序主要用到的数据结
8、构有以下:1Math.random() * 1000,获取随机数字2for (int i = 0; i < 10; i+)if (rtti > maxRtt)maxRtt = rtti;if(rtti!=0)if (rtti < minRtt)minRtt = rtti; sumRtt += rtti; ,通过循环获取极值。五关键性的代码1客户端发送请求和接收回复 DatagramSocket clientSocket = new DatagramSocket();/生成client端socket实例InetAddress IPAddress = InetAddress.ge
9、tByName(address); /生成ip地址实例byte sendData = new byte1024; /用于接收数据的byte数组byte receiveData = new byte1024;/用于发送数据的byte数组sendData = sentence.getBytes();DatagramPacket sendPacket = new DatagramPacket(sendData, sendData.length, IPAddress, port);/生成发送数据包Date sendBefore = new Date();/发送前时clientSocket.send(s
10、endPacket); /发送DatagramPacket receivePacket = new DatagramPacket(receiveData,receiveData.length);/生成接收数据包clientSocket.receive(receivePacket); /接收从server返回的数据包Date receiveAfter = new Date(); /接收后的时间 /最多等待1秒以便接收PingServer返回的reply消息。如果在该时间内没有收到服务器的reply,则认为该请求或对该请求的reply已经丢失String modifiedSentence = &q
11、uot;"if(receiveAfter.getTime() - sendBefore.getTime()>1000) modifiedSentence = "请求超过1秒,模拟数据丢失!n"rtti-1=(long)0; /当收不到reply时,置折返时间为0,不加入计算elsemodifiedSentence = new String(receivePacket.getData();rtti - 1 = receiveAfter.getTime() - sendBefore.getTime();2.服务器端接收请求和回复客户端new Thread()Ov
12、erridepublic void run() int cilentCount = 0; /客户端的数量(多个客户端) /服务器端一直处于接收状态while (true)byte sendData = new byte1024;DatagramPacket receivePacket = new DatagramPacket(receiveData, receiveData.length);/生成接收数据报包实例try serverSocket.receive(receivePacket); catch (Exception e) e.printStackTrace(); /从客户端接收到请求
13、String sentence = new String(receivePacket.getData();InetAddress IPAddress = receivePacket.getAddress(); /获得client端的ip int port = receivePacket.getPort(); /获得client端的portlong randomTime = (long) (Math.random() * 1000); /生成随机数,用于模拟传输延迟try Thread.sleep(randomTime); catch (InterruptedException e) e.pri
14、ntStackTrace(); /程度睡眠,用于模拟传输延迟if(sentence.substring(7,8).equals("1")&&!sentence.substring(7,9).equals("10") cilentCount+; System.out.println("*");System.out.println("* 第 "+cilentCount+" 台客户端机正在请求! *");System.out.println("*n");System
15、.out.println("从客户端接收到的信息为:");System.out.println("");System.out.println(sentence);sendData = sentence.getBytes(); DatagramPacket sendPacket = new DatagramPacket(sendData, sendData.length, IPAddress, port); /生成数据包try serverSocket.send(sendPacket); catch (Exception e) e.printStackTr
16、ace(); /发回client端.start();六开发过程中遇到的问题及解决办法1. 问题:在编写程序的过程中,因为对socket编程不了解,导致不能正确让客户端和服务器端相互发送消息。 解决:网上查询socket相关的编程知识,调用java JDK中包下的DatagramSocket和DatagramPacket类,实现客户端和服务器端的信息交流。2问题:刚开始编程时,服务器端不能服务多个客户端。 解决:通过多线程编程,使不同客户端的请求运行在不同的线程,来实现服务器端对多个客户端的请求服务。七程序中待解决的问题及改进方向1待解决的问题:程序界面不过人性化。 改进方向:继续深入优化八程序
17、测试结果客户端请求服务器端回复以下为完整代码客户端代码import java.io.BufferedReader;import java.io.InputStreamReader;import java.io.StringReader;import .DatagramPacket;import .DatagramSocket;import .InetAddress;import java.text.SimpleDateFormat;import java.util.Date;/*PingClient,客户端,有以下功能 3.1启动后发送10个request。发送一个request后,最多等待1
18、秒以便接收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 po
19、rt。 host为PingServer所在的主机地址;port为PingServer的工作端口号*/public class PingClientpublic static void main(String args) throws ExceptionString address = args0; /从命令行获得server ip地址int port = new Integer(args1); /从命令行获得端口号long rtt = new long10; /用于折返时间的统计System.out.println("n客户端启动,开始发送请求!nnn");for (int
20、 i = 1; i <= 10; i+) /发送10条请求SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss.SS"); /时间戳格式String sentence = "头部: 请求 " + i + " n"/请求数据+ "payload:PingUDP 序号:" + i + " 时间戳:"+ sdf.format(new Date()+"n"DatagramSocket clientSoc
21、ket = new DatagramSocket(); /生成client端socket实例InetAddress IPAddress = InetAddress.getByName(address); /生成ip地址实例byte sendData = new byte1024; /用于接收数据的byte数组byte receiveData = new byte1024; /用于发送数据的byte数组sendData = sentence.getBytes();DatagramPacket sendPacket = new DatagramPacket(sendData, sendData.l
22、ength, IPAddress, port);/生成发送数据包Date sendBefore = new Date(); /发送前时间clientSocket.send(sendPacket); /发送DatagramPacket receivePacket = new DatagramPacket(receiveData,receiveData.length);/生成接收数据包clientSocket.receive(receivePacket); /接收从server返回的数据包Date receiveAfter = new Date(); /接收后的时间 /最多等待1秒以便接收Ping
23、Server返回的reply消息。如果在该时间内没有收到服务器的reply,则认为该请求或对该请求的reply已经丢失String modifiedSentence = ""if(receiveAfter.getTime() - sendBefore.getTime()>1000) modifiedSentence = "请求 "+i+" 超过1秒,模拟数据丢失!"rtti - 1 = (long) 0; /当收不到reply时,置折返时间为0,不加入计算else modifiedSentence = new String(re
24、ceivePacket.getData();rtti - 1 = receiveAfter.getTime() - sendBefore.getTime();System.out.println("折返时间和服务端的返回信息为:"); System.out.println("");System.out.println("折返时间(RTT):" + rtti - 1);System.out.println(modifiedSentence); /显示从server返回的数据 if(rtti - 1=0) System.out.print
25、ln("nnnnnn"); clientSocket.close(); /关闭socket/统计出平均rtt,最大rtt和最小rttlong sumRtt = 0;long maxRtt = 0; long k = 0;long minRtt = rtt0; int j = 0;for (int i = 0; i < 10; i+) if(rtti > k)if (rtti > maxRtt)maxRtt = rtti;if (rtti < minRtt) minRtt = rtti; j+;sumRtt += rtti; System.out.pr
26、intln("最终折返时间为:"); System.out.println("");System.out.println("平均折返时间: " + sumRtt / j +"ms");System.out.println("最大折返时间: " + maxRtt+"ms");System.out.println("最小折返时间: " + minRtt+"ms"); System.out.println("");服务端代
27、码import java.io.BufferedReader;import java.io.InputStreamReader;import .DatagramPacket;import .DatagramSocket;import .InetAddress;/* * Ping Server服务器端,完成以下功能 * 2.1 可以并发地为多个用户服务; 2.2 显示用户通过客户端发送来的消息内容(包含头部和payload); 2.3 能够模拟分组的丢失;能够模拟分组传输延迟; 2.4 将用户发送来的请求request在延迟一段随机选择的时间(小于1s)后返回给客户端,作为收到请求的响应repl
28、y; 2.5 通过如下命令行启动服务器:java PingServer port。 port为PingServer的工作端口号 */public class PingServerpublic static void main(String args) throws ExceptionSystem.out.println("n服务端启动,等待客户端请求.nnn");int initPort = new Integer(args0); /从命令行获得port args0DatagramSocket serverSocket = new DatagramSocket(initPo
29、rt); /根据port,生成server端socket实例byte receiveData = new byte1024; /* * 使用多线程编程,可以实现多个客户端同时请求服务端 */new Thread()Overridepublic void run() int cilentCount = 0; /客户端的数量(多个客户端) /服务器端一直处于接收状态while (true)byte sendData = new byte1024;DatagramPacket receivePacket = new DatagramPacket(receiveData, receiveData.length);/生成接收数据报包实例try serverSocket.receive(receivePacket); catch (E
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2024年汽车出行未来展望报告
- 2024至2030年中国呋喃唑酮片(痢特灵)行业投资前景及策略咨询研究报告
- 2024至2030年四工位密封式负荷开关项目投资价值分析报告
- 2024至2030年双驴头项目投资价值分析报告
- 2024至2030年中国中棉29种子行业投资前景及策略咨询研究报告
- 2024至2030年再生革项目投资价值分析报告
- 2024至2030年CCTL冷阴极灯管项目投资价值分析报告
- 2024年高强封装型母线项目可行性研究报告
- 初中语文阅读理解答题技巧课件
- 小学语文《天窗》课件
- 少年宫乒乓球兴趣小组简介
- 当事人送达地址、送达方式确认书模板
- 静脉输液流程图
- 国开电大本科《管理英语4》机考真题(第八套)
- 基础会计第5版课后参考答案王艳茹
- 北中大中药药剂学实验指导17临界相对湿度与吸湿速度的测定
- 二年级扩句练习
- 滋养叶细胞疾病超声诊断
- 内科学知到章节答案智慧树2023年菏泽医学专科学校
- 隧道工程移动脚手架平台施工专项方案
- 初中语文记叙文阅读理解训练(附答案)
评论
0/150
提交评论