[计网编程]写一个UDP Ping程序

 

https://docs.oracle.com/javase/7/docs/api/java/net/DatagramSocket.html DatagramSocket的官方文档

https://docs.oracle.com/javase/7/docs/api/java/net/InetAddress.html       

InetAddress表示一个IP地址,其实例包括ip还有可能有端口号

https://docs.oracle.com/javase/7/docs/api/java/net/DatagramPacket.html

DatagramPacket的官方文档

 

package practice2;

import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.util.Date;
import java.text.SimpleDateFormat;

public class PingClient {
	
	public static void main(String[] args) throws Exception{
		if(args.length == 0){
			System.out.println("Required arguments:host port");
			return;//如果控制台输入数据为空 则返回。控制台输入数据用空格隔开,存储在args数组里
		}
		
		String host = args[0].toString();//IP address
		int port = Integer.parseInt(args[1]);//port 
		
		DatagramSocket clientSocket = new DatagramSocket();
		clientSocket.setSoTimeout(1000);//设置等待server回答的时间,以ms为单位。如果是0,则无限等待
		
		InetAddress IPAddress = InetAddress.getByName(host);
		
		for(int i = 0;i<10;i++){
			byte[] sendData = new byte[1024];
			byte[] receiveData = new byte[1024];
			Date currentTime = new Date();
			SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
			String timeStamp = sdf.format(currentTime);
			String pingMessage = "Ping" + i + " " + timeStamp + " " +"\r\n";
			sendData = pingMessage.getBytes();
			
			DatagramPacket sendPacket = new DatagramPacket(sendData, sendData.length,IPAddress,port);
			try{
				clientSocket.send(sendPacket);
				
				DatagramPacket receivePacket = new DatagramPacket(receiveData, receiveData.length);
				clientSocket.receive(receivePacket);
				String reply = new String(receivePacket.getData());
				System.out.println("FROM SERVER: "+reply);
			}catch(java.net.SocketTimeoutException e){
				String reply = "No reply : ";
				System.out.println("FROM SERVER: "+reply);
			}
		}
		clientSocket.close();
	}
}
package practice2;

import java.io.BufferedReader;
import java.io.ByteArrayInputStream;
import java.io.InputStreamReader;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.util.Random;

public class PingServer {
	private static final double LOSS_RATE = 0.3;
	private static final int AVERAGE_DELAY = 100;
	public static void main(String[] args) throws Exception{
		if(args.length != 1){
			System.out.println("Required arguments:port");
			return;
		}
		
		int port = Integer.parseInt(args[0]);
		
		Random random = new Random();/*创造随机数用来模拟丢包和网络延迟*/
		DatagramSocket socket = new DatagramSocket(port);
		
		while(true){
			DatagramPacket request = new DatagramPacket(new byte[1024], 1024); //创造一个packet以接收收到的udp包
			
			socket.receive(request);
			printData(request);
			
			if(random.nextDouble()<LOSS_RATE){
				System.out.println("Reply not sent");
				continue;
			}
			
			Thread.sleep((int)(random.nextDouble()*2*AVERAGE_DELAY));
			
			//发送对应的pong报文
			InetAddress clientHost = request.getAddress();
			int clientPort = request.getPort();
			byte[] buffer = request.getData();
			DatagramPacket reply = new DatagramPacket(buffer, buffer.length,clientHost,clientPort);
			socket.send(reply);
			
			System.out.println("Reply sent");
		}
	}
	
	private static void printData(DatagramPacket request) throws Exception{
		byte[] buffer = request.getData();
		
		ByteArrayInputStream bais = new ByteArrayInputStream(buffer);
		
		InputStreamReader isr = new InputStreamReader(bais);
		
		BufferedReader br = new BufferedReader(isr);
		
		String line = br.readLine();
		
		System.out.println("Received from" + request.getAddress().getHostAddress()+":"+new String(line));
		
	}
}

写好之后要进行测试。。查了半天也不知道怎么测试。。在这里记录一下踩的坑

打开cmd窗口 运行javac命令进行编译 然后先运行Server程序。附上端口号

再开一个cmd窗口 javac编译 运行Client程序。附上ip和端口号

就可以测试了

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值