计算机网络课程设计报告3.docx
- 文档编号:8405385
- 上传时间:2023-01-31
- 格式:DOCX
- 页数:15
- 大小:264.32KB
计算机网络课程设计报告3.docx
《计算机网络课程设计报告3.docx》由会员分享,可在线阅读,更多相关《计算机网络课程设计报告3.docx(15页珍藏版)》请在冰豆网上搜索。
计算机网络课程设计报告3
后面有完整代码
计算机网络课程设计报告
编程实现基于UDP的PING
学院计算机学院
专业
学号
学生姓名
指导教师姜
2017年6月
计算机网络课程设计
一.程序开发的基础知识
1.PING的相关知识
Ping是Windows、Unix和Linux系统下的一个命令。
ping也属于一个通信协议,是TCP/IP协议的一部分。
利用“ping”命令可以检查网络是否连通,可以很好地帮助我们分析和判定网络故障。
应用格式:
Ping空格IP地址。
PING(PacketInternetGroper),因特网包探索器,用于测试网络连接量的程序。
Ping发送一个ICMP(InternetControlMessagesProtocol)即因特网信报控制协议;回声请求消息给目的地并报告是否收到所希望的ICMPecho(ICMP回声应答)。
它是用来检查网络是否通畅或者网络连接速度的命令。
作为一个生活在网络上的管理员或者黑客来说,ping命令是第一个必须掌握的DOS命令,它所利用的原理是这样的:
利用网络上机器IP地址的唯一性,给目标IP地址发送一个数据包,再要求对方返回一个同样大小的数据包来确定两台网络机器是否连接相通,时延是多少。
ping指的是端对端连通,通常用来作为可用性的检查,但是某些病毒木马会强行大量远程执行ping命令抢占你的网络资源,导致系统变慢,网速变慢。
严禁ping入侵作为大多数防火墙的一个基本功能提供给用户进行选择。
通常的情况下你如果不用作服务器或者进行网络测试,可以放心的选中它,保护你的电脑。
2.UDP的相关知识
UDP是UserDatagramProtocol的简称,全称是用户数据报协议 ,在网络中它与TCP协议一样用于处理数据包,是一种无连接的协议。
在OSI模型中,在第四层——传输层,处于IP协议的上一层。
UDP有不提供数据包分组、组装和不能对数据包进行排序的缺点,也就是说,当报文发送之后,是无法得知其是否安全完整到达的。
UDP用来支持那些需要在计算机之间传输数据的网络应用。
包括网络视频会议系统在内的众多的客户/服务器模式的网络应用都需要使用UDP协议。
UDP协议从问世至今已经被使用了很多年,虽然其最初的光彩已经被一些类似协议所掩盖,但是即使是在今天UDP仍然不失为一项非常实用和可行的网络传输层协议。
与所熟知的TCP(传输控制协议)协议一样,UDP协议直接位于IP(网际协议)协议的顶层。
根据OSI(开放系统互连)参考模型,UDP和TCP都属于传输层协议。
UDP协议的主要作用是将网络数据流量压缩成数据包的形式。
一个典型的数据包就是一个二进制数据的传输单位。
每一个数据包的前8个字节用来包含报头信息,剩余字节则用来包含具体的传输数据。
3.Socket通信机制相关知识
网络上的两个程序通过一个双向的通信连接实现数据的交换,这个连接的一端称为一个socket。
建立网络通信连接至少要一对端口号(socket)。
socket本质是编程接口(API),对TCP/IP的封装,TCP/IP也要提供可供程序员做网络开发所用的接口,这就是Socket编程接口;HTTP是轿车,提供了封装或者显示数据的具体形式;Socket是发动机,提供了网络通信的能力。
Socket的英文原义是“孔”或“插座”。
作为BSDUNIX的进程通信机制,取后一种意思。
通常也称作"套接字",用于描述IP地址和端口,是一个通信链的句柄,可以用来实现不同虚拟机或不同计算机之间的通信。
在Internet上的主机一般运行了多个服务软件,同时提供几种服务。
每种服务都打开一个Socket,并绑定到一个端口上,不同的端口对应于不同的服务。
Socket正如其英文原意那样,像一个多孔插座。
一台主机犹如布满各种插座的房间,每个插座有一个编号,有的插座提供220伏交流电,有的提供110伏交流电,有的则提供有线电视节目。
客户软件将插头插到不同编号的插座,就可以得到不同的服务。
二.设计思路
本程序是通过基于UDP的socket的网络编程,来实现客户端和服务器端的信息传输,包括客户端发送请求给服务器端、服务器端回应客户端,以致实现PING的效果。
具体的思路是通过调用javaJDK中包下的DatagramSocket和DatagramPacket类,可以实现对用户数据报文的控制,DatagramSocket类用于创建接收和发送UDP的Socket实例,调用DatagramPacket类用于处理报文,因为它可以将Byte数组、目标地址、目标端口等数据包装成报文或者将报文拆卸成Byte数组。
这样就可以实现客户端和服务器端的信息交流了。
以此来达到ping的功能。
再通过多线程编程的思想,让不同客户端的请求运行在不同的线程,来实现服务器端为多个客户端服务的功能。
三.
程序流程图
四.关键数据结构
本程序主要用到的数据结构有以下:
1.Math.random()*1000,获取随机数字
2.for(inti=0;i<10;i++)
{if(rtt[i]>maxRtt){maxRtt=rtt[i];}
if(rtt[i]!
=0){if(rtt[i] }sumRtt+=rtt[i];},通过循环获取极值。 五.关键性的代码 1.客户端发送请求和接收回复 DatagramSocketclientSocket=newDatagramSocket();//生成client端socket实例 InetAddressIPAddress=InetAddress.getByName(address);//生成ip地址实例 byte[]sendData=newbyte[1024];//用于接收数据的byte数组 byte[]receiveData=newbyte[1024];//用于发送数据的byte数组 sendData=sentence.getBytes(); DatagramPacketsendPacket=newDatagramPacket(sendData,sendData.length,IPAddress,port);//生成发送数据包 DatesendBefore=newDate();//发送前时 clientSocket.send(sendPacket);//发送 DatagramPacketreceivePacket=newDatagramPacket(receiveData,receiveData.length);//生成接收数据包 clientSocket.receive(receivePacket);//接收从server返回的数据包 DatereceiveAfter=newDate();//接收后的时间 //最多等待1秒以便接收PingServer返回的reply消息。 如果在该时间内没有收到服务器的reply,则认为该请求或对该请求的reply已经丢失 StringmodifiedSentence=""; if(receiveAfter.getTime()-sendBefore.getTime()>1000){ modifiedSentence="请求超过1秒,模拟数据丢失! ! \n"; rtt[i-1]=(long)0;//当收不到reply时,置折返时间为0,不加入计算 }else{modifiedSentence=newString(receivePacket.getData()); rtt[i-1]=receiveAfter.getTime()-sendBefore.getTime(); } 2.服务器端接收请求和回复客户端 newThread(){@Override publicvoidrun(){ intcilentCount=0;//客户端的数量(多个客户端) //服务器端一直处于接收状态 while(true){ byte[]sendData=newbyte[1024]; DatagramPacketreceivePacket=newDatagramPacket(receiveData,receiveData.length);//生成接收数据报包实例 try{serverSocket.receive(receivePacket);}catch(Exceptione){e.printStackTrace();}//从客户端接收到请求 Stringsentence=newString(receivePacket.getData()); InetAddressIPAddress=receivePacket.getAddress();//获得client端的ip intport=receivePacket.getPort();//获得client端的port longrandomTime=(long)(Math.random()*1000);//生成随机数,用于模拟传输延迟 try{Thread.sleep(randomTime);}catch(InterruptedExceptione){e.printStackTrace();}//程度睡眠,用于模拟传输延迟 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.out.println("从客户端接收到的信息为: "); System.out.println("@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@"); System.out.println(sentence);sendData=sentence.getBytes(); DatagramPacketsendPacket=newDatagramPacket(sendData,sendData.length,IPAddress,port);//生成数据包 try{serverSocket.send(sendPacket);}catch(Exceptione){e.printStackTrace();}//发回client端} }.start(); 六.开发过程中遇到的问题及解决办法 1.问题: 在编写程序的过程中,因为对socket编程不了解,导致不能正确让客户端和服务器端相互发送消息。 解决: 网上查询socket相关的编程知识,调用javaJDK中包下的DatagramSocket和DatagramPacket类,实现客户端和服务器端的信息交流。 2.问题: 刚开始编程时,服务器端不能服务多个客户端。 解决: 通过多线程编程,使不同客户端的请求运行在不同的线程,来实现服务器端对多个客户端的请求服务。 七.程序中待解决的问题及改进方向 1.待解决的问题: 程序界面不过人性化。 改进方向: 继续深入优化 八.程序测试结果 客户端请求 服务器端回复 以下为完整代码 客户端代码 importjava.io.BufferedReader; importjava.io.InputStreamReader; importjava.io.StringReader; import.DatagramPacket; import.DatagramSocket; import.InetAddress; importjava.text.SimpleDateFormat; importjava.util.Date; /*PingClient,客户端,有以下功能 3.1启动后发送10个request。 发送一个request后,最多等待1秒以便接收PingServer返回的reply消息。 如果在该时间内没有收到服务器的reply,则认为该请求或对该请求的reply已经丢失;在收到reply后立即发送下一个request。 3.2请求消息的payload中至少包含关键字PingUDP、序号、时间戳等内容。 如: PingUDPSequenceNumberTimeStampCRLF 其中: CRLF表示回车换行符(0X0D0A);TimeStamp为发送该消息的机器时间。 3.3为每个请求计算折返时间(RTT),统计10个请求的平均RTT、最大/小RTT。 3.4通过如下命令行启动: javaPingClienthostport。 host为PingServer所在的主机地址;port为PingServer的工作端口号 */ publicclassPingClient { publicstaticvoidmain(String[]args)throwsException { Stringaddress=args[0];//从命令行获得serverip地址 intport=newInteger(args[1]);//从命令行获得端口号 long[]rtt=newlong[10];//用于折返时间的统计 System.out.println("\n客户端启动,开始发送请求! ! ! ! \n\n\n"); for(inti=1;i<=10;i++)//发送10条请求 { SimpleDateFormatsdf=newSimpleDateFormat("yyyy-MM-ddhh: mm: ss.SS");//时间戳格式 Stringsentence="头部: 请求"+i+"\n"//请求数据 +"payload: PingUDP序号: "+i+"时间戳: " +sdf.format(newDate())+"\n@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@"; DatagramSocketclientSocket=newDatagramSocket();//生成client端socket实例 InetAddressIPAddress=InetAddress.getByName(address);//生成ip地址实例 byte[]sendData=newbyte[1024];//用于接收数据的byte数组 byte[]receiveData=newbyte[1024];//用于发送数据的byte数组 sendData=sentence.getBytes(); DatagramPacketsendPacket=newDatagramPacket(sendData,sendData.length,IPAddress,port);//生成发送数据包 DatesendBefore=newDate();//发送前时间 clientSocket.send(sendPacket);//发送 DatagramPacketreceivePacket=newDatagramPacket(receiveData,receiveData.length);//生成接收数据包 clientSocket.receive(receivePacket);//接收从server返回的数据包 DatereceiveAfter=newDate();//接收后的时间 //最多等待1秒以便接收PingServer返回的reply消息。 如果在该时间内没有收到服务器的reply,则认为该请求或对该请求的reply已经丢失 StringmodifiedSentence=""; if(receiveAfter.getTime()-sendBefore.getTime()>1000){ modifiedSentence="请求"+i+"超过1秒,模拟数据丢失! ! "; rtt[i-1]=(long)0;//当收不到reply时,置折返时间为0,不加入计算 }else{ modifiedSentence=newString(receivePacket.getData()); rtt[i-1]=receiveAfter.getTime()-sendBefore.getTime(); } System.out.println("折返时间和服务端的返回信息为: "); System.out.println("@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@"); System.out.println("折返时间(RTT): "+rtt[i-1]); System.out.println(modifiedSentence);//显示从server返回的数据 if(rtt[i-1]==0){ System.out.println("@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@\n\n\n\n\n\n"); } clientSocket.close();//关闭socket } //统计出平均rtt,最大rtt和最小rtt longsumRtt=0; longmaxRtt=0; longk=0; longminRtt=rtt[0]; intj=0; for(inti=0;i<10;i++) { if(rtt[i]>k){ if(rtt[i]>maxRtt) { maxRtt=rtt[i]; } if(rtt[i] { minRtt=rtt[i]; } j++; sumRtt+=rtt[i];} } System.out.println("最终折返时间为: "); System.out.println("@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@"); System.out.println("平均折返时间: "+sumRtt/j+"ms"); System.out.println("最大折返时间: "+maxRtt+"ms"); System.out.println("最小折返时间: "+minRtt+"ms"); System.out.println("@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@"); } } 服务端代码 importjava.io.BufferedReader; importjava.io.InputStreamReader; import.DatagramPacket; import.DatagramSocket; import.InetAddress; /** *PingServer服务器端,完成以下功能 *2.1可以并发地为多个用户服务; 2.2显示用户通过客户端发送来的消息内容(包含头部和payload); 2.3能够模拟分组的丢失;能够模拟分组传输延迟; 2.4将用户发送来的请求request在延迟一段随机选择的时间(小于1s)后返回给客户端,作为收到请求的响应reply; 2.5通过如下命令行启动服务器: javaPingServerport。 port为PingServer的工作端口号 */ publicclassPingServer { publicstaticvoidmain(String[]args)throwsException { System.out.println("\n服务端启动,等待客户端请求.......\n\n\n"); intinitPort=newInteger(args[0]);//从命令行获得portargs[0] DatagramSocketserverSocket=newDatagramSocket(initPort);//根据port,生成server端socket实例 byte[]receiveData=newbyte[1024]; /* *使用多线程编程,可以实现多个客户端同时请求服务端 */ newThread(){ @Override publicvoidrun(){ intcilentCount=0;//客户端的数量(多个客户端) //服务器端一直处于接收状态 while(true) { byte[]sendData=newbyte[1024]; DatagramPacketreceivePacket=newDatagramPacket(receiveData,receiveData.length);//生成接收数据报包实例 try{serverSocket.receive(receivePacket);}catch(Exceptione){e.printStackTrace();}//从客户端接收到请求 Stringsentence=newString(receivePacket.getData());
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 计算机网络 课程设计 报告