From 5bcde6eba9a46baad799d9a8652dffb0de87cd95 Mon Sep 17 00:00:00 2001 From: Mark Slee Date: Wed, 27 Sep 2006 17:50:32 +0000 Subject: [PATCH] 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 --- lib/java/src/transport/TServerSocket.java | 54 +++++++++++++++++++++-- lib/java/src/transport/TSocket.java | 46 +++++++++++++++++-- 2 files changed, 94 insertions(+), 6 deletions(-) diff --git a/lib/java/src/transport/TServerSocket.java b/lib/java/src/transport/TServerSocket.java index 8a8421d2..ab2b5e7b 100644 --- a/lib/java/src/transport/TServerSocket.java +++ b/lib/java/src/transport/TServerSocket.java @@ -4,6 +4,7 @@ import java.io.IOException; 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 @@ import java.net.Socket; */ 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) { + 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 class TServerSocket extends TServerTransport { } } - 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 @@ public class TServerSocket extends TServerTransport { } 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); } diff --git a/lib/java/src/transport/TSocket.java b/lib/java/src/transport/TSocket.java index 6b4fa3bb..544a1d58 100644 --- a/lib/java/src/transport/TSocket.java +++ b/lib/java/src/transport/TSocket.java @@ -5,6 +5,7 @@ import java.io.BufferedOutputStream; import java.io.IOException; import java.net.InetSocketAddress; import java.net.Socket; +import java.net.SocketException; /** * Socket implementation of the TTransport interface. To be commented soon! @@ -13,15 +14,26 @@ import java.net.Socket; */ public class TSocket extends TIOStreamTransport { - /** Wrapped Socket object */ + /** + * Wrapped Socket object + */ private Socket socket_ = null; - /** Remote host */ + /** + * Remote host + */ private String host_ = null; - /** Remote port */ + /** + * Remote port + */ private int port_ = 0; + /** + * Socket timeout + */ + private int timeout_ = 0; + /** * Constructor that takes an already created socket. * @@ -30,6 +42,7 @@ public class TSocket extends TIOStreamTransport { */ public TSocket(Socket socket) throws TTransportException { socket_ = socket; + if (isOpen()) { try { inputStream_ = new BufferedInputStream(socket_.getInputStream(), 1024); @@ -49,9 +62,36 @@ public class TSocket extends TIOStreamTransport { * @param port Remote port */ public TSocket(String host, int port) { + this(host, port, 500); + } + + /** + * Creates a new unconnected socket that will connect to the given host + * on the given port. + * + * @param host Remote host + * @param port Remote port + * @param timeout Socket timeout + */ + public TSocket(String host, int port, int timeout) { socket_ = new Socket(); host_ = host; port_ = port; + timeout_ = timeout; + } + + /** + * Sets the socket timeout + * + * @param timeout Milliseconds timeout + */ + public void setTimeout(int timeout) { + timeout_ = timeout; + try { + socket_.setSoTimeout(timeout); + } catch (SocketException sx) { + sx.printStackTrace(); + } } /** -- 2.17.1