您好,欢迎访问三七文档
当前位置:首页 > 办公文档 > 其它办公文档 > 计算机网络课程设计报告
后面有完整代码计算机网络课程设计报告编程实现基于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中java.net包下的DatagramSocket和DatagramPacket类,可以实现对用户数据报文的控制,DatagramSocket类用于创建接收和发送UDP的Socket实例,调用DatagramPacket类用于处理报文,因为它可以将Byte数组、目标地址、目标端口等数据包装成报文或者将报文拆卸成Byte数组。这样就可以实现客户端和服务器端的信息交流了。以此来达到ping的功能。再通过多线程编程的思想,让不同客户端的请求运行在不同的线程,来实现服务器端为多个客户端服务的功能。三.程序流程图四.关键数据结构本程序主要用到的数据结构有以下:1.Math.random()*1000,获取随机数字2.for(inti=0;i10;i++){if(rtt[i]maxRtt){maxRtt=rtt[i];}if(rtt[i]!=0){if(rtt[i]minRtt){minRtt=rtt[i];}}sumRtt+=rtt[i];},通过循环获取极值。开始等待客户端请求回复请求接收请求信息服务器端开始循环10次请求模拟请求丢失收到回复折返时间RTT1000ms模拟请求丢失客户端五.关键性的代码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(){@Overridepublicvoidrun(){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端的ipintport=receivePacket.getPort();//获得client端的portlongrandomTime=(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中java.net包下的DatagramSocket和DatagramPacket类,实现客户端和服务器端的信息交流。2.问题:刚开始编程时,服务器端不能服务多个客户端。解决:通过多线程编程,使不同客户端的请求运行在不同的线程,来实现服务器端对多个客户端的请求服务。七.程序中待解决的问题及改进方向1.待解决的问题:程序界面不过人性化。改进方向:继续深入优化八.程序测试结果客户端请求服务器端回复以下为完整代码客户端代码importjava.io.BufferedReader;importjava.io.InputStreamReader;importjava.io.StringReader;importjava.net.DatagramPacket;importjava.net.DatagramSocket;importjava.net.InetAddress;importjava.text.SimpleDateFormat;importjava.util.Date;/*PingClient,客户端,有以下功能3.1启动后发送10个request
本文标题:计算机网络课程设计报告
链接地址:https://www.777doc.com/doc-1495183 .html