View Javadoc

1   // Copyright (C) 2003 - 2012 Philip Aston
2   // All rights reserved.
3   //
4   // This file is part of The Grinder software distribution. Refer to
5   // the file LICENSE which is part of The Grinder distribution for
6   // licensing details. The Grinder distribution is available on the
7   // Internet at http://grinder.sourceforge.net/
8   //
9   // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
10  // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
11  // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
12  // FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
13  // COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
14  // INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
15  // (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
16  // SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
17  // HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
18  // STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
19  // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
20  // OF THE POSSIBILITY OF SUCH DAMAGE.
21  
22  package net.grinder.communication;
23  
24  import java.net.InetAddress;
25  import java.net.ServerSocket;
26  import java.net.Socket;
27  import java.net.UnknownHostException;
28  
29  
30  /**
31   * Active acceptor that accepts a single connection.
32   */
33  public final class SocketAcceptorThread extends Thread {
34  
35    private final ServerSocket m_serverSocket;
36    private final int m_numberOfAccepts;
37    private Exception m_exception;
38    private Socket m_acceptedSocket;
39  
40    public static SocketAcceptorThread create() throws Exception {
41      final SocketAcceptorThread acceptor = new SocketAcceptorThread(1);
42      acceptor.start();
43      return acceptor;
44    }
45  
46    private SocketAcceptorThread(int numberOfAccepts) throws Exception {
47      m_serverSocket = new ServerSocket(0);
48      m_numberOfAccepts = numberOfAccepts;
49    }
50  
51    public void run() {
52      try {
53        for (int i=0; i<m_numberOfAccepts; ++i) {
54          m_acceptedSocket = m_serverSocket.accept();
55        }
56      }
57      catch (Exception e) {
58        m_exception = e;
59      }
60    }
61  
62    public String getHostName() throws UnknownHostException {
63      return InetAddress.getByName(null).getHostName();
64    }
65  
66    public int getPort() {
67      return m_serverSocket.getLocalPort();
68    }
69  
70    public Socket getAcceptedSocket() {
71      return m_acceptedSocket;
72    }
73  
74    public final void close() throws Exception {
75  
76      join();
77  
78      if (m_exception != null) {
79        throw m_exception;
80      }
81  
82      m_serverSocket.close();
83    }
84  }