Mega Code Archive

 
Categories / Java / Network Protocol
 

A timeout feature on socket connections

import java.io.IOException; import java.io.InterruptedIOException; import java.net.InetAddress; import java.net.Socket; /**  * This class offers a timeout feature on socket connections.  * A maximum length of time allowed for a connection can be   * specified, along with a host and port.  *  * @author David Reilly (written for JavaWorld)  * @author Daniel Matuschek  * @version $Id: TimedSocket.java,v 1.2 2002/05/31 14:45:56 matuschd Exp $  *  * imported to the net.matuschek.util source tree by Daniel Matuschek   */ public class TimedSocket {   /**    * Attempts to connect to a service at the specified address    * and port, for a specified maximum amount of time.    *    * @param addr  Address of host    * @param port  Port of service    * @param delay Delay in milliseconds    */   public static Socket getSocket ( InetAddress addr, int port, int delay)      throws InterruptedIOException, IOException   {     // Create a new socket thread, and start it running     SocketThread st = new SocketThread( addr, port );     st.start();          int timer = 0;     Socket sock = null;          for (;;) {       // Check to see if a connection is established              if (st.isConnected()) {   // Yes ...  assign to sock variable, and break out of loop   sock = st.getSocket();   break;       } else {   // Check to see if an error occurred   if (st.isError()) {     // No connection could be established     throw (st.getException());   }      try {     // Sleep for a short period of time     Thread.sleep ( POLL_DELAY );   } catch (InterruptedException ie) {}      // Increment timer   timer += POLL_DELAY;      // Check to see if time limit exceeded   if (timer > delay) {     // Can't connect to server     throw new InterruptedIOException("Could not connect for " +               delay + " milliseconds");   }       }     }          return sock;   }      /**    * Attempts to connect to a service at the specified address    * and port, for a specified maximum amount of time.    *    * @param host  Hostname of machine    * @param port  Port of service    * @param delay Delay in milliseconds    */   public static Socket getSocket ( String host, int port, int delay)      throws InterruptedIOException, IOException   {     // Convert host into an InetAddress, and call getSocket method     InetAddress inetAddr = InetAddress.getByName (host);          return getSocket ( inetAddr, port, delay );   }         /**    * Inner class for establishing a socket thread    * within another thread, to prevent blocking.    */   static class SocketThread extends Thread   {     // Socket connection to remote host     volatile private Socket m_connection = null;     // Hostname to connect to     private String m_host       = null;     // Internet Address to connect to     private InetAddress m_inet  = null;     // Port number to connect to     private int    m_port       = 0;     // Exception in the event a connection error occurs     private IOException m_exception = null;          // Connect to the specified host and port number     public SocketThread ( String host, int port) {       // Assign to member variables       m_host = host;       m_port = port;     }          // Connect to the specified host IP and port number     public SocketThread ( InetAddress inetAddr, int port ) {       // Assign to member variables       m_inet = inetAddr;       m_port = port;     }          public void run() {       // Socket used for establishing a connection       Socket sock = null;              try {   // Was a string or an inet specified   if (m_host != null) {     // Connect to a remote host - BLOCKING I/O     sock = new Socket (m_host, m_port);   } else {     // Connect to a remote host - BLOCKING I/O     sock = new Socket (m_inet, m_port);   }       }       catch (IOException ioe) {   // Assign to our exception member variable   m_exception = ioe;   return;       }       // If socket constructor returned without error,       // then connection finished       m_connection = sock;     }     // Are we connected?     public boolean isConnected() {       if (m_connection == null)   return false;       else   return true;     }     // Did an error occur?     public boolean isError() {       if (m_exception == null)   return false;       else   return true;     }     // Get socket     public Socket getSocket() {       return m_connection;     }          // Get exception     public IOException getException() {       return m_exception;     }   }      /** Polling delay for socket checks (in milliseconds) */   private static final int POLL_DELAY = 100; }