Add socket and server socket timeout support to thrift java


git-svn-id: https://svn.apache.org/repos/asf/incubator/thrift/trunk@664804 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/lib/java/src/transport/TServerSocket.java b/lib/java/src/transport/TServerSocket.java
index 8a8421d..ab2b5e7 100644
--- a/lib/java/src/transport/TServerSocket.java
+++ b/lib/java/src/transport/TServerSocket.java
@@ -4,6 +4,7 @@
 import java.net.InetSocketAddress;
 import java.net.ServerSocket;
 import java.net.Socket;
+import java.net.SocketException;
 
 /**
  * Wrapper around ServerSocket for Thrift.
@@ -12,19 +13,55 @@
  */
 public class TServerSocket extends TServerTransport {
   
+  /**
+   * Underlying serversocket object
+   */
   private ServerSocket serverSocket_ = null;
+
+  /**
+   * Port to listen on
+   */
   private int port_ = 0;
 
+  /**
+   * Timeout for client sockets from accept
+   */
+  private int clientTimeout_ = 0;
+
+  /**
+   * Creates a server socket from underlying socket object
+   */
   public TServerSocket(ServerSocket serverSocket) {
-    serverSocket_ = serverSocket;
+    this(serverSocket, 0);
   }
 
+  /**
+   * Creates a server socket from underlying socket object
+   */
+  public TServerSocket(ServerSocket serverSocket, int clientTimeout) {
+    serverSocket_ = serverSocket;
+    clientTimeout_ = clientTimeout;
+  }
+
+  /**
+   * Creates just a port listening server socket
+   */
   public TServerSocket(int port) throws TTransportException {
+    this(port, 0);
+  }
+
+  /**
+   * Creates just a port listening server socket
+   */
+  public TServerSocket(int port, int clientTimeout) throws TTransportException {
     port_ = port;
+    clientTimeout_ = clientTimeout;
     try {
+      // Make server socket
       serverSocket_ = new ServerSocket();
+      // Prevent 2MSL delay problem on server restarts
       serverSocket_.setReuseAddress(true);
-      serverSocket_.setSoTimeout(0);
+      // Bind to listening port
       serverSocket_.bind(new InetSocketAddress(port_));
     } catch (IOException ioe) {
       serverSocket_ = null;
@@ -32,7 +69,16 @@
     }
   }
 
-  public void listen() throws TTransportException {}
+  public void listen() throws TTransportException {
+    // Make sure not to block on accept
+    if (serverSocket_ != null) {
+      try {
+        serverSocket_.setSoTimeout(0);
+      } catch (SocketException sx) {
+        sx.printStackTrace();
+      }
+    }
+  }
   
   protected TSocket acceptImpl() throws TTransportException {
     if (serverSocket_ == null) {
@@ -40,7 +86,9 @@
     }
     try {
       Socket result = serverSocket_.accept();
-      return new TSocket(result);
+      TSocket result2 = new TSocket(result);
+      result2.setTimeout(clientTimeout_);
+      return result2;
     } catch (IOException iox) {
       throw new TTransportException(iox);
     }