1. 服务器端代码 PingServer.java
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;
public class PingServer{
private int initPort;
private DatagramSocket socket;
private DatagramPacket packet;
private byte[] buf = new byte[1024];
public PingServer(int initPort) {
this.initPort = initPort;
}
public void run() {
System.out.println("编程实现基于UDP的PING (Java)服务器端");
System.out.println("----------PING SERVER STARTED---------");
try {
socket = new DatagramSocket(initPort);
} catch (SocketException e) {
System.out.println("Listening port" + initPort + "fail!");
e.printStackTrace();
System.exit(0);
}
while(true) {
packet = new DatagramPacket(buf,buf.length);
try {
socket.receive(packet);
} catch (IOException e) {
System.out.println("Request receive exception!");
e.printStackTrace();
}
ThreadServer server = new ThreadServer(socket,packet);
server.start();
}
}
public void destroy() {
socket.close();
}
public static void main(String[] args) {
PingServer ping = new PingServer(Integer.valueOf(args[0]));
ping.run();
}
}
2. 服务器端线程代码 ThreadServer.java
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
public class ThreadServer extends Thread{
private DatagramSocket socket;
private DatagramPacket packet;
public ThreadServer(DatagramSocket socket, DatagramPacket packet) {
this.socket = socket;
this.packet = packet;
}
public void run() {
long randomTime = (long)(Math.random()*1500);
String data = null;
if(randomTime>1400) {
data = "Receive message lost!";
System.out.println(data);
}else {
data = new String(packet.getData());
System.out.println("Receiving a message:" + data);
}
byte[] buffer = data.getBytes();
InetAddress host = packet.getAddress();
int port = packet.getPort();
DatagramPacket sendPacket = new DatagramPacket(buffer,buffer.length,host,port);
try {
sleep(randomTime);
} catch (InterruptedException e) {
e.printStackTrace();
}
try {
socket.send(sendPacket);
} catch (IOException e) {
System.out.println("The server failed to send a reply message!");
e.printStackTrace();
}
}
}
3. 客户端代码 PingClient.java
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 replyNum = 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("Invalid port number!");
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("Invalid host name!");
e.printStackTrace();
}
}
public void run() {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-ddhh:mm:ss.SS");
System.out.println("Pinging " + hostAddress + ":");
for(int i=0; i<10; i++) {
Date sendTime = new Date();
String outMessage = "head:request " + i +"\n"
+ "payload:PingUDP SequenceNUmber:" + i
+ " TimeStamp:" + sdf.format(sendTime);
byte[] buffer = outMessage.getBytes();
DatagramPacket sendPacket = new DatagramPacket(buffer,buffer.length,hostAddress,port);
byte[] buf = new byte[buffer.length];
DatagramPacket recievePacket = new DatagramPacket(buf,buf.length);
String recieve = null;
try {
client.send(sendPacket);
client.receive(recievePacket);
recieve = new String(recievePacket.getData());
Date recieveTime = new Date();
rtt[i] = recieveTime.getTime()-sendTime.getTime();
} catch (IOException e) {
e.printStackTrace();
}
if(rtt[i]>1000) {
recieve = "head:request "+ i +"\n"
+ "Response message lost or Request timed out!";
}else {
recieve = recieve + "\n" + "rtt:" + rtt[i] +"ms";
}
System.out.println(recieve);
}
minRtt = rtt[0];
for(int i=0;i<10;i++) {
if(rtt[i] > 1000) continue;
replyNum++;
if(minRtt > rtt[i]) {
minRtt = rtt[i];
}
if(maxRtt < rtt[i]) {
maxRtt = rtt[i];
}
sumRtt += rtt[i];
}
if(replyNum!=0) {
averRtt = sumRtt/replyNum;
System.out.println("Ping statistics for " + hostAddress + ":");
System.out.println(" Packets: Sent=10, Received=" + replyNum +", Lost=" + (10-replyNum));
System.out.println("Approximate round trip times in milli-seconds:");
System.out.println(" minRTT:" + minRtt + "ms, maxRTT:" + maxRtt + "ms, averRTT:" + averRtt + "ms");
}else {
System.out.println("Failed to send request! Unable to return message!");
}
client.close();
}
public static void main(String[] args) {
PingClient clientThread = new PingClient(args[0], Integer.valueOf(args[1]));
clientThread.start();
}
}
4. 在运行时可能遇上的问题及其解决方法
cmd错误:找不到或无法加载主类 和 错误:找不到符号