Catch a greater variety of
exception classes. There are several
subclasses of SocketException
; the most notable of
these are
ConnectException
and
NoRouteToHostException
. The names are
self-explanatory: the first means that the connection was refused by
the machine at the other end (the server machine), and the second
completely explains the failure. Example 15-3
is an excerpt from the Connect
program, enhanced
to handle these conditions.
Example 15-3. ConnectFriendly.java
/* Client with error handling */ public class ConnectFriendly { public static void main(String[] argv) { String server_name = argv.length == 1 ? argv[0] : "localhost"; int tcp_port = 80; try { Socket sock = new Socket(server_name, tcp_port); /* Finally, we can read and write on the socket. */ System.out.println(" *** Connected to " + server_name + " ***"); /* ... */ sock.close( ); } catch (UnknownHostException e) { System.err.println(server_name + " Unknown host"); return; } catch (NoRouteToHostException e) { System.err.println(server_name + " Unreachable" ); return; } catch (ConnectException e) { System.err.println(server_name + " connect refused"); return; } catch (java.io.IOException e) { System.err.println(server_name + ' ' + e.getMessage( )); return; } } }
52.15.42.128