-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathPingServer.java
More file actions
157 lines (132 loc) · 5.52 KB
/
PingServer.java
File metadata and controls
157 lines (132 loc) · 5.52 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
/*
*
* Server to process ping requests over UDP
*
* Usage: java PingServer port passwd [-delay delay] [-loss loss]
*
* Thanks: base on PingServer by instructor Qiao Xiang
*/
// PingServer.java
import java.io.*;
import java.net.*;
import java.text.SimpleDateFormat;
import java.util.*;
public class PingServer
{
private static double LOSS_RATE = 0.3;
private static int AVERAGE_DELAY = 100; // milliseconds
public static void main(String[] args) throws Exception
{
// Get command line argument.
if (args.length <= 1) {
System.out.println("Usage: java PingServer port passwd [-delay delay] [-loss loss]");
return;
}
if (args.length >= 3) {
if(args[2].matches("-delay(.*)")){
AVERAGE_DELAY = Integer.parseInt(args[3]);
}
if(args[2].matches("-loss(.*)")){
LOSS_RATE = Double.parseDouble(args[3]);
}
}
if (args.length >= 5) {
if(args[4].matches("-delay(.*)")){
AVERAGE_DELAY = Integer.parseInt(args[5]);
}
if(args[4].matches("-loss(.*)")){
LOSS_RATE = Double.parseDouble(args[5]);
}
}
int port = Integer.parseInt(args[0]);
String passwd = args[1];
System.out.println("AVERAGE_DELAY: " + AVERAGE_DELAY + " LOSS_RATE: " + LOSS_RATE +
" port: " + port + " passwd: " + passwd);
// Create random number generator for use in simulating
// packet loss and network delay.
Random random = new Random();
// Create a datagram socket for receiving and sending
// UDP packets through the port specified on the
// command line.
DatagramSocket socket = new DatagramSocket(port);
// Processing loop.
while (true) {
// Create a datagram packet to hold incomming UDP packet.
DatagramPacket
request = new DatagramPacket(new byte[128], 128);
// Block until receives a UDP packet.
// Wait
socket.receive(request);
// Print the received data, for debugging
printData(request);
// Check passwd
String sentence = new String(request.getData());
sentence = URLDecoder.decode(sentence, "UTF-8");
sentence = sentence.replaceFirst("PING", "PINGECHO");
String[] clientItem = sentence.split(" ");
if (passwd.compareTo(clientItem[3]) == 0) {
System.out.println("Passwd correct!");
}
else {
System.out.println("Wrong passwd!");
}
// Decide whether to reply, or simulate packet loss.
if (random.nextDouble() < LOSS_RATE) {
System.out.println(" Reply not sent.");
System.out.println("----------------------------------");
continue;
}
// Simulate prorogation delay.
Thread.sleep((int) (random.nextDouble() * 2 * AVERAGE_DELAY));
// Send reply.
// Time in the format of Java currentTimeMill
SimpleDateFormat formatter1 = new SimpleDateFormat("HH:mm:ss");
Date date1 = new Date(System.currentTimeMillis());
sentence = clientItem[0] + " " + clientItem[1] + " " + formatter1.format(date1) + " " + clientItem[3];
sentence = URLEncoder.encode(sentence, "utf-8");
InetAddress clientHost = request.getAddress();
int clientPort = request.getPort();
byte[] buf = sentence.getBytes();
DatagramPacket
reply = new DatagramPacket(buf, sentence.length(),
clientHost, clientPort);
socket.send(reply);
System.out.println(" Reply sent.");
System.out.println("----------------------------------");
} // end of while
} // end of main
/*
* Print ping data to the standard output stream.
*/
private static void printData(DatagramPacket request)
throws Exception
{
// Obtain references to the packet's array of bytes.
byte[] buf = request.getData();
// Wrap the bytes in a byte array input stream,
// so that you can read the data as a stream of bytes.
ByteArrayInputStream bais
= new ByteArrayInputStream(buf);
// Wrap the byte array output stream in an input
// stream reader, so you can read the data as a
// stream of **characters**: reader/writer handles
// characters
InputStreamReader isr
= new InputStreamReader(bais);
// Wrap the input stream reader in a bufferred reader,
// so you can read the character data a line at a time.
// (A line is a sequence of chars terminated by any
// combination of \r and \n.)
BufferedReader br
= new BufferedReader(isr);
// The message data is contained in a single line,
// so read this line.
String line = br.readLine();
line = URLDecoder.decode(line, "utf-8");
// Print host address and data received from it.
System.out.println("Received from " +
request.getAddress().getHostAddress() +
": " +
new String(line) );
} // end of printData
} // end of class