blob: ab2b5e7b7cc18609109865d1c1ba6bfa246051d7 [file] [log] [blame]
Mark Slee83c52a82006-06-07 06:51:18 +00001package com.facebook.thrift.transport;
2
3import java.io.IOException;
Mark Sleeffcddd62006-09-06 20:37:03 +00004import java.net.InetSocketAddress;
Mark Slee83c52a82006-06-07 06:51:18 +00005import java.net.ServerSocket;
6import java.net.Socket;
Mark Slee5bcde6e2006-09-27 17:50:32 +00007import java.net.SocketException;
Mark Slee83c52a82006-06-07 06:51:18 +00008
9/**
10 * Wrapper around ServerSocket for Thrift.
11 *
12 * @author Mark Slee <mcslee@facebook.com>
13 */
14public class TServerSocket extends TServerTransport {
15
Mark Slee5bcde6e2006-09-27 17:50:32 +000016 /**
17 * Underlying serversocket object
18 */
Mark Sleeffcddd62006-09-06 20:37:03 +000019 private ServerSocket serverSocket_ = null;
Mark Slee5bcde6e2006-09-27 17:50:32 +000020
21 /**
22 * Port to listen on
23 */
Mark Sleeffcddd62006-09-06 20:37:03 +000024 private int port_ = 0;
25
Mark Slee5bcde6e2006-09-27 17:50:32 +000026 /**
27 * Timeout for client sockets from accept
28 */
29 private int clientTimeout_ = 0;
30
31 /**
32 * Creates a server socket from underlying socket object
33 */
Mark Slee83c52a82006-06-07 06:51:18 +000034 public TServerSocket(ServerSocket serverSocket) {
Mark Slee5bcde6e2006-09-27 17:50:32 +000035 this(serverSocket, 0);
Mark Slee83c52a82006-06-07 06:51:18 +000036 }
37
Mark Slee5bcde6e2006-09-27 17:50:32 +000038 /**
39 * Creates a server socket from underlying socket object
40 */
41 public TServerSocket(ServerSocket serverSocket, int clientTimeout) {
42 serverSocket_ = serverSocket;
43 clientTimeout_ = clientTimeout;
44 }
45
46 /**
47 * Creates just a port listening server socket
48 */
Mark Sleeffcddd62006-09-06 20:37:03 +000049 public TServerSocket(int port) throws TTransportException {
Mark Slee5bcde6e2006-09-27 17:50:32 +000050 this(port, 0);
51 }
52
53 /**
54 * Creates just a port listening server socket
55 */
56 public TServerSocket(int port, int clientTimeout) throws TTransportException {
Mark Sleeffcddd62006-09-06 20:37:03 +000057 port_ = port;
Mark Slee5bcde6e2006-09-27 17:50:32 +000058 clientTimeout_ = clientTimeout;
Mark Sleeffcddd62006-09-06 20:37:03 +000059 try {
Mark Slee5bcde6e2006-09-27 17:50:32 +000060 // Make server socket
Mark Sleeffcddd62006-09-06 20:37:03 +000061 serverSocket_ = new ServerSocket();
Mark Slee5bcde6e2006-09-27 17:50:32 +000062 // Prevent 2MSL delay problem on server restarts
Mark Sleeffcddd62006-09-06 20:37:03 +000063 serverSocket_.setReuseAddress(true);
Mark Slee5bcde6e2006-09-27 17:50:32 +000064 // Bind to listening port
Mark Sleeffcddd62006-09-06 20:37:03 +000065 serverSocket_.bind(new InetSocketAddress(port_));
66 } catch (IOException ioe) {
67 serverSocket_ = null;
68 throw new TTransportException("Could not create ServerSocket on port " + port + ".");
69 }
70 }
71
Mark Slee5bcde6e2006-09-27 17:50:32 +000072 public void listen() throws TTransportException {
73 // Make sure not to block on accept
74 if (serverSocket_ != null) {
75 try {
76 serverSocket_.setSoTimeout(0);
77 } catch (SocketException sx) {
78 sx.printStackTrace();
79 }
80 }
81 }
Mark Slee83c52a82006-06-07 06:51:18 +000082
83 protected TSocket acceptImpl() throws TTransportException {
84 if (serverSocket_ == null) {
85 throw new TTransportException("No underlying server socket.");
86 }
87 try {
88 Socket result = serverSocket_.accept();
Mark Slee5bcde6e2006-09-27 17:50:32 +000089 TSocket result2 = new TSocket(result);
90 result2.setTimeout(clientTimeout_);
91 return result2;
Mark Slee83c52a82006-06-07 06:51:18 +000092 } catch (IOException iox) {
93 throw new TTransportException(iox);
94 }
95 }
96
97 public void close() {
98 if (serverSocket_ != null) {
99 try {
100 serverSocket_.close();
101 } catch (IOException iox) {
102 System.err.println("WARNING: Could not close server socket: " +
103 iox.getMessage());
104 }
105 serverSocket_ = null;
106 }
107 }
108
109}