package sockslib.quickstart;
import sockslib.client.Socks5;
import sockslib.client.SocksSocket;
import sockslib.common.UsernamePasswordCredentials;
import sockslib.common.net.MonitorSocketWrapper;
import sockslib.common.net.NetworkMonitor;
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.io.InputStream;
import java.io.OutputStream;
import java.net.InetSocketAddress;
import java.net.Socket;
/**
* The class <code>TCPTimeClient</code> is client for {@link TCPTimeServer}.
*
* @author Youchao Feng
* @version 1.0
* @date Sep 24, 2015 2:45 PM
*/
public class TCPTimeClient {
private static final Logger logger = LoggerFactory.getLogger(TCPTimeClient.class);
public static void main(@Nullable String[] args) {
new TCPTimeClient().start(args);
}
public void start(@Nullable String[] args) {
Timer.open();
String host = "localhost";
int port = 5051;
String proxyHost = null;
int proxyPort = 1080;
boolean useProxy = false;
String username = null;
String password = null;
String message = "Hi, I am UDP client";
if (args != null) {
for (String arg : args) {
if (arg.equals("-h") || arg.equals("--help")) {
showHelp();
System.exit(0);
} else if (arg.startsWith("--proxy-host=")) {
proxyHost = Arguments.valueOf(arg);
useProxy = true;
} else if (arg.startsWith("--proxy-port=")) {
proxyPort = Arguments.intValueOf(arg);
} else if (arg.startsWith("--proxy-user=")) {
username = Arguments.valueOf(arg);
} else if (arg.startsWith("--proxy-password=")) {
password = Arguments.valueOf(arg);
} else if (arg.startsWith("--host=")) {
host = Arguments.valueOf(arg);
} else if (arg.startsWith("--port=")) {
port = Arguments.intValueOf(arg);
} else if (arg.startsWith("--message=")) {
message = Arguments.valueOf(arg);
} else {
logger.error("Unknown argument [{}]", arg);
System.exit(-1);
}
}
}
if (useProxy && proxyHost == null) {
logger.error("Please use [--proxy-host] to set proxy server's hostname if you want to use "
+ "SOCKS proxy");
System.exit(-1);
}
try {
Socket socket = null;
if (useProxy) {
Socks5 proxy = new Socks5(new InetSocketAddress(proxyHost, proxyPort));
if (username != null && password != null) {
proxy.setCredentials(new UsernamePasswordCredentials(username, password));
}
logger.info("Connect server [{}:{}] by proxy:{}", host, port, proxy);
socket = new SocksSocket(proxy, host, port);
} else {
socket = new Socket(host, port);
}
NetworkMonitor monitor = new NetworkMonitor();
socket = new MonitorSocketWrapper(socket, monitor);
InputStream inputStream = socket.getInputStream();
OutputStream outputStream = socket.getOutputStream();
String sendMessage = "Hi, I am TCP time client";
if (message != null) {
sendMessage = message;
}
sendMessage += "\n";
outputStream.write(sendMessage.getBytes());
outputStream.flush();
byte[] buffer = new byte[1045 * 5];
int length = inputStream.read(buffer);
String receiveMessage = new String(buffer, 0, length);
logger.info("Server response:{}", receiveMessage);
inputStream.close();
outputStream.close();
socket.close();
logger.info("Total send:{}, Total receive:{}, Total:{}", monitor.getTotalSend(), monitor
.getTotalReceive(), monitor.getTotal());
} catch (IOException e) {
logger.error(e.getMessage(), e);
}
}
public void showHelp() {
String a = "1";
System.out.println("Usage: [Options]");
System.out.println(" --host=<val> TCP time server host, default \"localhost\"");
System.out.println(" --port=<val> TCP time server port, default \"5051\"");
System.out.println(" --proxy-host=<val> Host of SOCKS5 proxy server");
System.out.println(" --proxy-port=<val> Port of SOCKS5 proxy server, default \"1080\"");
System.out.println(" --proxy-user=<val> Username of SOCKS5 proxy server");
System.out.println(" --proxy-password=<val> Password of SOCKS5 proxy server");
System.out.println(" --message=<val> The message which will send to server");
System.out.println(" -h or --help Show help");
}
}