try {
// Check the number of arguments
if (args.length != 2)
throw new IllegalArgumentException("Wrong number of arguments");
// Parse the host and port specifications
String host = args[0];
int port = Integer.parseInt(args[1]);
// Connect to the specified host and port
Socket s = new Socket(host, port);
// Set up streams for reading from and writing to the server.
// The from_server stream is final for use in the anonymous class below
final Reader from_server = new InputStreamReader(s.getInputStream());
PrintWriter to_server =
new PrintWriter(new OutputStreamWriter(s.getOutputStream()));
// Set up streams for reading from and writing to the console
// The to_user stream is final for use in the anonymous class below.
BufferedReader from_user =
new BufferedReader(new InputStreamReader(System.in));
final PrintWriter to_user =
new PrintWriter(new OutputStreamWriter(System.out));
// Tell the user that we've connected
to_user.println("Connected to " + s.getInetAddress() + ":"+ s.getPort());
to_user.flush();
// Create a thread that gets output from the server and displays
// it to the user. We use a separate thread for this so that we can
// receive asynchronous output
Thread t = new Thread() {
public void run() {
char[] buffer = new char[1024];
int chars_read;
try {
while((chars_read = from_server.read(buffer)) != -1) {
to_user.write(buffer, 0, chars_read);
to_user.flush();
}
}
catch (IOException e) { to_user.println(e); }
// When the server closes the connection, the loop above will end.
// Tell the user what happened, and call System.exit(), causing
// the main thread to exit along with this one.
to_user.println("Connection closed by server.");
to_user.flush();
System.exit(0);
}
};
// We set the priority of the server-to-user thread above to be one
// level higher than the main thread. We shouldn't have to do this, but
// on some operating systems, output sent to the console doesn't appear
// when a thread at the same priority level is blocked waiting for
// input from the console.
t.setPriority(Thread.currentThread().getPriority() + 1);
// Now start the server-to-user thread
t.start();
// And in parallel, read the user's input and pass it on to the server.
String line;
while((line = from_user.readLine()) != null) {
to_server.println(line);
to_server.flush();
}
// If the user types a Ctrl-D (Unix) or Ctrl-Z (Windows) to end their
// input, we'll get and EOF, and the loop above will exit. When this
// happens, we stop the server-to-user thread and close the socket.
t.stop();
s.close();
to_user.println("Connection closed by client.");
to_user.flush();
}
// If anything goes wrong, print an error message
catch (Exception e) {
System.err.println(e);
System.err.println("Usage: java GenericClient <hostname> <port>");
}