基于Java实现PING的服务器端和客户端设计

发布于:2022-12-08 ⋅ 阅读:(779) ⋅ 点赞:(0)

资源下载地址:https://download.csdn.net/download/sheziqiong/86833949
资源下载地址:https://download.csdn.net/download/sheziqiong/86833949
目录
一、任务书
二、程序开发的基础知识
三、设计思路
四、程序流程图
五、关键数据结构
六、关键性的代码
七、开发过程中遇到的问题及解决办法
八、程序中待解决的问题及改进方向。
一、计算机网络课程设计任务书
设计题目 编程实现基于UDP的PING
已知技术参数和设计要求 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小时

二、程序开发的基础知识

  1. ICMP协议:网络层协议,确认IP包是否成功到达目标地址,通知在发送过程中IP包被丢弃的原因。
  2. ping命令的工作机理:ping命令会先发送一个 ICMP Echo Request给对端,对端接收到之后,会返回一个ICMP Echo Reply;若没有返回,就是超时了,会认为指定的网络地址不存在。
  3. UDP的通信机制与TCP的通信机制差别很大,UDP的通信都是基于包进行的,使用Datagram类与DatagramPacket类。
    4.使用Socket进行网络通信的过程:服务器程序将一个 Socket绑定到一个特定的端口,并通过此Socket等待和监听客户的连接请求。本文转载自http://www.biyezuopin.vip/onews.asp?id=14922客户程序根据服务器程序所在的主机名和端口号发出连接请求。如果一切正常,服务器接受连接请求,并获得一个新的绑定到不同端口地址的Socket。客户和服务器通过读、写Socket进行通讯。
    5.多线程:多线程指的是在单个程序中可以同时运行多个不同的线程执行不同的任务。一个程序实现多个代码同时交替运行就需要产生多个线程。
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
import java.net.UnknownHostException;
import java.text.SimpleDateFormat;
import java.util.Date;

public class PingClient extends Thread{
	private DatagramSocket client;
	private InetAddress hostAddress;
	private int port;
	private int replyNumber = 0;
	private long minRtt = 0, maxRtt = 0, averRtt = 0,sumRtt = 0;
	private long[] rtt = new long[10];
	
	public PingClient(String host, int port) {
		if(port < 0 || port > 65535) {
			System.out.println("非法端口号!");
			System.exit(0);
		}
		this.port = port;
		try {
			client = new DatagramSocket();
			hostAddress = InetAddress.getByName(host);
		} catch (SocketException e) {
			e.printStackTrace();
		} catch (UnknownHostException e) {
			System.out.println("非法主机名称!");
		}	
	}

	public void run() {
		String dateFormat = "yyyy-MM-dd HH:mm:ss.SS";
		SimpleDateFormat sdf = new SimpleDateFormat(dateFormat);	
		System.out.println("Pinging " + hostAddress + ":");

		for(int i=0; i<10; i++) {

			Date sendTime = new Date(); //发送该消息的机器时间
			String outMessage = "请求报文" + i +"\n" + "PingUDP SequenceNumber:" + i + " TimeStamp:" + sdf.format(sendTime) + "\n";		

			//发送报文
			byte[] buffer = outMessage.getBytes();
			DatagramPacket sendPacket = new DatagramPacket(buffer,buffer.length,hostAddress,port);
			
			//接收报文
			byte[] buf = new byte[buffer.length];		
			DatagramPacket receivePacket = new DatagramPacket(buf,buf.length);
			
			String receiveData = null;
			try {
				client.send(sendPacket);
				
				client.receive(receivePacket);
				receiveData = new String(receivePacket.getData());
				Date receiveTime = new Date();
				rtt[i] = receiveTime.getTime()-sendTime.getTime();
				
			} catch (IOException e) {
				e.printStackTrace();
			}
			
			//等待时间不超过1s
			if(rtt[i]>1000) {
				receiveData = "\n请求报文"+ i + "的响应信息丢失或请求超时!";
			}else {
				receiveData = "\n" + receiveData + "折返时间:" + rtt[i] +"ms";
			}
			System.out.println(receiveData);			
		}
		
		minRtt = rtt[0];
		for(int i=0;i<10;i++) {
			if(rtt[i] > 1000)  continue;	
			if(minRtt > rtt[i]) minRtt = rtt[i];
			if(maxRtt < rtt[i]) maxRtt = rtt[i];
			sumRtt += rtt[i];
			replyNumber++;
		}
		
		if(replyNumber!=0) {
			averRtt = sumRtt/replyNumber;
			
			System.out.println("\nPing主机" + hostAddress + "的结果为:");
			System.out.println("数据报:发送10, 接收" + replyNumber +", 丢失" + (10-replyNumber));
			System.out.println("最小折返时间:" + minRtt + "ms\n最大折返时间:" + maxRtt + "ms\n平均折返时间:" + averRtt + "ms");
		}else {
			System.out.println("发送请求失败!无法返回信息!");
		}
	}
	
	public static void main(String[] args) {
		PingClient clientThread = new PingClient(args[0], Integer.valueOf(args[1]));
		clientThread.start();
	}
}

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
资源下载地址:https://download.csdn.net/download/sheziqiong/86833949
资源下载地址:https://download.csdn.net/download/sheziqiong/86833949


网站公告

今日签到

点亮在社区的每一天
去签到