package sockslib.quickstart;
import sockslib.client.SocksProxy;
import sockslib.utils.Arguments;
import sockslib.utils.Timer;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import javax.annotation.Nullable;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Date;
/**
* @author Youchao Feng
* @version 1.0
* @date Sep 24, 2015 2:21 PM
*/
public class TCPTimeServer implements Runnable {
private static final Logger logger = LoggerFactory.getLogger(TCPTimeServer.class);
private static final int DEFAULT_PORT = 5051;
private String[] args;
private boolean stop = false;
private Thread thread;
private ServerSocket server;
public static void main(@Nullable String[] args) {
Timer.open();
TCPTimeServer server = new TCPTimeServer();
server.start(args);
}
public void start(@Nullable String[] args) {
this.args = args;
stop = false;
thread = new Thread(this);
thread.start();
}
public void shutdown() {
stop = true;
if (thread != null) {
thread.interrupt();
}
if (server != null && server.isBound()) {
try {
server.close();
} catch (IOException e) {
logger.error(e.getMessage(), e);
}
}
}
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");
}
@Override
public void run() {
int port = DEFAULT_PORT;
SocksProxy socksProxy = null;
String alwaysResponse = null;
String proxyHost = null;
String proxyUsername = null;
String proxyPassword = 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 {
server = new ServerSocket(port);
logger.info("TCP time server created at {}", server.getInetAddress(), port);
while (!stop) {
Socket socket = server.accept();
InputStream inputStream = socket.getInputStream();
OutputStream outputStream = socket.getOutputStream();
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
int b;
while ((b = (byte) inputStream.read()) != -1) {
if (b == '\n') {
break;
}
byteArrayOutputStream.write(b);
}
byte[] buffer = byteArrayOutputStream.toByteArray();
String receive = new String(buffer);
logger.info("Client from {} send:{}", socket.getRemoteSocketAddress(), receive);
if (receive.equals("shutdown")) {
break;
}
String response = new Date().toString();
if (alwaysResponse != null) {
response = alwaysResponse;
}
response += "\n";
outputStream.write(response.getBytes());
outputStream.flush();
inputStream.close();
outputStream.close();
socket.close();
}
} catch (IOException e) {
logger.error(e.getMessage(), e);
}
}
}