blob: 9badf1ac19498788fe6716b5f319ada9d8e80c78 [file] [log] [blame]
Mark Slee7eb0d632007-03-01 00:00:27 +00001// Copyright (c) 2006- Facebook
2// Distributed under the Thrift Software License
3//
4// See accompanying file LICENSE or visit the Thrift site at:
5// http://developers.facebook.com/thrift/
6
Mark Slee83c52a82006-06-07 06:51:18 +00007package com.facebook.thrift.transport;
8
9import java.io.IOException;
Mark Sleeffcddd62006-09-06 20:37:03 +000010import java.net.InetSocketAddress;
Mark Slee83c52a82006-06-07 06:51:18 +000011import java.net.ServerSocket;
12import java.net.Socket;
Mark Slee5bcde6e2006-09-27 17:50:32 +000013import java.net.SocketException;
Mark Slee83c52a82006-06-07 06:51:18 +000014
15/**
16 * Wrapper around ServerSocket for Thrift.
17 *
18 * @author Mark Slee <mcslee@facebook.com>
19 */
20public class TServerSocket extends TServerTransport {
21
Mark Slee5bcde6e2006-09-27 17:50:32 +000022 /**
23 * Underlying serversocket object
24 */
Mark Sleeffcddd62006-09-06 20:37:03 +000025 private ServerSocket serverSocket_ = null;
Mark Slee5bcde6e2006-09-27 17:50:32 +000026
27 /**
28 * Port to listen on
29 */
Mark Sleeffcddd62006-09-06 20:37:03 +000030 private int port_ = 0;
31
Mark Slee5bcde6e2006-09-27 17:50:32 +000032 /**
33 * Timeout for client sockets from accept
34 */
35 private int clientTimeout_ = 0;
36
37 /**
38 * Creates a server socket from underlying socket object
39 */
Mark Slee83c52a82006-06-07 06:51:18 +000040 public TServerSocket(ServerSocket serverSocket) {
Mark Slee5bcde6e2006-09-27 17:50:32 +000041 this(serverSocket, 0);
Mark Slee83c52a82006-06-07 06:51:18 +000042 }
43
Mark Slee5bcde6e2006-09-27 17:50:32 +000044 /**
45 * Creates a server socket from underlying socket object
46 */
47 public TServerSocket(ServerSocket serverSocket, int clientTimeout) {
48 serverSocket_ = serverSocket;
49 clientTimeout_ = clientTimeout;
50 }
51
52 /**
53 * Creates just a port listening server socket
54 */
Mark Sleeffcddd62006-09-06 20:37:03 +000055 public TServerSocket(int port) throws TTransportException {
Mark Slee5bcde6e2006-09-27 17:50:32 +000056 this(port, 0);
57 }
58
59 /**
60 * Creates just a port listening server socket
61 */
62 public TServerSocket(int port, int clientTimeout) throws TTransportException {
Mark Sleeffcddd62006-09-06 20:37:03 +000063 port_ = port;
Mark Slee5bcde6e2006-09-27 17:50:32 +000064 clientTimeout_ = clientTimeout;
Mark Sleeffcddd62006-09-06 20:37:03 +000065 try {
Mark Slee5bcde6e2006-09-27 17:50:32 +000066 // Make server socket
Mark Sleeffcddd62006-09-06 20:37:03 +000067 serverSocket_ = new ServerSocket();
Mark Slee5bcde6e2006-09-27 17:50:32 +000068 // Prevent 2MSL delay problem on server restarts
Mark Sleeffcddd62006-09-06 20:37:03 +000069 serverSocket_.setReuseAddress(true);
Mark Slee5bcde6e2006-09-27 17:50:32 +000070 // Bind to listening port
Mark Sleeffcddd62006-09-06 20:37:03 +000071 serverSocket_.bind(new InetSocketAddress(port_));
72 } catch (IOException ioe) {
73 serverSocket_ = null;
74 throw new TTransportException("Could not create ServerSocket on port " + port + ".");
75 }
76 }
77
Mark Slee5bcde6e2006-09-27 17:50:32 +000078 public void listen() throws TTransportException {
79 // Make sure not to block on accept
80 if (serverSocket_ != null) {
81 try {
82 serverSocket_.setSoTimeout(0);
83 } catch (SocketException sx) {
84 sx.printStackTrace();
85 }
86 }
87 }
Mark Slee83c52a82006-06-07 06:51:18 +000088
89 protected TSocket acceptImpl() throws TTransportException {
90 if (serverSocket_ == null) {
Mark Sleeb46c0412007-02-21 04:54:38 +000091 throw new TTransportException(TTransportException.NOT_OPEN, "No underlying server socket.");
Mark Slee83c52a82006-06-07 06:51:18 +000092 }
93 try {
94 Socket result = serverSocket_.accept();
Mark Slee5bcde6e2006-09-27 17:50:32 +000095 TSocket result2 = new TSocket(result);
96 result2.setTimeout(clientTimeout_);
97 return result2;
Mark Slee83c52a82006-06-07 06:51:18 +000098 } catch (IOException iox) {
99 throw new TTransportException(iox);
100 }
101 }
102
103 public void close() {
104 if (serverSocket_ != null) {
105 try {
106 serverSocket_.close();
107 } catch (IOException iox) {
108 System.err.println("WARNING: Could not close server socket: " +
109 iox.getMessage());
110 }
111 serverSocket_ = null;
112 }
113 }
114
115}