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
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和端口号
就可以测试了