Added shutdown() methods for the socket-based PickManager code.
[vamsas.git] / src / uk / ac / vamsas / client / picking / PickServer.java
1 package uk.ac.vamsas.client.picking;\r
2 \r
3 import java.io.*;\r
4 import java.net.*;\r
5 import java.util.logging.*;\r
6 \r
7 import org.apache.commons.logging.Log;\r
8 \r
9 /**\r
10  * Server class that listens for incoming connections on a predefined port.\r
11  */\r
12 class PickServer extends Thread\r
13 {\r
14         private Log logger = org.apache.commons.logging.LogFactory.getLog(uk.ac.vamsas.client.picking.PickServer.class);\r
15         \r
16         // The port number we'll listen on\r
17         static final int PORT = 53782;\r
18         \r
19         private ServerSocket serverSocket;\r
20         // Set to true once the server is established\r
21         private boolean isServer = false;\r
22         \r
23         private SocketManager manager;\r
24         \r
25         /**\r
26          * Constructs a new instance of the server (but doesn't start it).\r
27          * @param manager a reference to the pick manager that owns this server\r
28          */\r
29         PickServer(SocketManager manager)\r
30         {\r
31                 this.manager = manager;\r
32         }\r
33         \r
34         /**\r
35          * Returns true if this server instance is running.\r
36          * Return true if this server instance is running\r
37          */\r
38         boolean isServer()\r
39                 { return isServer; }\r
40         \r
41         /**\r
42          * Attempts to create the server by opening a server socket on the port.\r
43          * @return true if the server was created; false otherwise\r
44          */\r
45         boolean createServer()\r
46         {\r
47                 try\r
48                 {\r
49                         serverSocket = new ServerSocket(PORT);\r
50                         start();                        \r
51                         \r
52                         return isServer = true;\r
53                 }\r
54                 catch (IOException e)\r
55                 {\r
56                         //logger.info("SERVER: " + e);\r
57                         return false;\r
58                 }\r
59         }\r
60         \r
61         /**\r
62          * Thread listening method - loops indefinitely listening for connections.\r
63          * When one is received, the socket object is passed to the manager so it\r
64          * can make a full client connection for further comms.\r
65          */\r
66         public void run()\r
67         {\r
68                 logger.info("SERVER: listening on " + PORT + " - SERVER");\r
69                 \r
70                 // Loop forever, accepting connectons from other clients\r
71                 // TODO: add in the ability to terminate the server if a VAMSAS session\r
72                 // is ended\r
73                 while (true)\r
74                 {\r
75                         try\r
76                         {\r
77                                 Socket socket = serverSocket.accept();                          \r
78                                 logger.info("SERVER: connection detected");\r
79                                 \r
80                                 manager.addEndPoint(socket);\r
81                         }\r
82                         catch (IOException e) {}\r
83                 }\r
84         }\r
85         \r
86         void terminate()\r
87         {\r
88                 logger.info("Server shutting down...");\r
89                 \r
90                 try { serverSocket.close(); }\r
91                 catch (Exception e)\r
92                 {\r
93                         logger.error(e);\r
94                 }\r
95         }\r
96 }