package sockslib.quickstart;
import sockslib.utils.Arguments;
import sockslib.utils.Timer;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import javax.annotation.Nullable;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetSocketAddress;
import java.util.Date;
/**
* @author Youchao Feng
* @version 1.0
* @date Sep 24, 2015 8:54 AM
*/
public class UDPTimeServer implements Runnable {
private static final Logger logger = LoggerFactory.getLogger(UDPTimeServer.class);
private int port = 5050;
private String[] args;
private Thread thread;
private boolean stop = false;
public static void main(@Nullable String[] args) {
Timer.open();
UDPTimeServer server = new UDPTimeServer();
server.start(args);
}
public void start(@Nullable String[] args) {
this.args = args;
thread = new Thread(this);
thread.setName("udp-time-server-thread");
thread.start();
stop = false;
}
public void shutdown() {
try {
DatagramSocket clientSocket = new DatagramSocket();
String shutdownSignal = "shutdown";
byte[] sendBuffer = shutdownSignal.getBytes();
DatagramPacket packet =
new DatagramPacket(sendBuffer, sendBuffer.length, new InetSocketAddress("localhost",
port));
clientSocket.send(packet);
} catch (IOException e) {
logger.error(e.getMessage(), e);
}
stop = true;
if (thread != null) {
thread.interrupt();
}
}
public void showHelp() {
System.out.println("Usage: [Options]");
System.out.println(" --port=<val> UDP server Test port");
System.out.println(" --always-response=<val> Server always responses <val> to client");
System.out.println(" -h or --help Show help");
}
public void startInCurrentThread(String[] args) {
this.args = args;
run();
}
@Override
public void run() {
String alwaysResponse = null;
if (args != null) {
for (String arg : args) {
if (arg.equals("-h") || arg.equals("--help")) {
showHelp();
System.exit(0);
} else if (arg.startsWith("--port=")) {
try {
port = Arguments.intValueOf(arg);
} catch (NumberFormatException e) {
logger.error("Value of [--port] should be a number");
System.exit(-1);
}
} else if (arg.startsWith("--always-response=")) {
alwaysResponse = Arguments.valueOf(arg);
} else {
logger.error("Unknown argument [{}]", arg);
return;
}
}
}
try {
logger.info("Starting UDP Time server...");
DatagramSocket server = new DatagramSocket(port);
logger.info("UDP Time server is created at port [{}]", server.getLocalPort());
logger.info("This server will print client request message and response current server time");
byte[] receiveBuffer = new byte[1024];
DatagramPacket receivePacket = new DatagramPacket(receiveBuffer, receiveBuffer.length);
while (!stop) {
server.receive(receivePacket);
String clientMessage = new String(receivePacket.getData(), 0, receivePacket.getLength());
logger.info("Client[{}] send:[{}]", receivePacket.getSocketAddress(), clientMessage);
if (clientMessage.equals("shutdown")) {
break;
}
String responseMsg = new Date().toString();
if (alwaysResponse != null) {
responseMsg = alwaysResponse;
}
byte[] data = responseMsg.getBytes();
DatagramPacket packet =
new DatagramPacket(data, data.length, receivePacket.getAddress(), receivePacket
.getPort());
server.send(packet);
}
server.close();
} catch (IOException e) {
logger.error(e.getMessage(), e);
}
logger.info("UDP time server shutdown");
}
}