3198427699886a067976ca324285aba632bfa9ec
[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   // Set to false when server is shutting down\r
23         private boolean isAlive= true;\r
24         private SocketManager manager;\r
25         \r
26         /**\r
27          * Constructs a new instance of the server (but doesn't start it).\r
28          * @param manager a reference to the pick manager that owns this server\r
29          */\r
30         PickServer(SocketManager manager)\r
31         {\r
32                 this.manager = manager;\r
33         }\r
34         \r
35         /**\r
36          * Returns true if this server instance is running.\r
37          * Return true if this server instance is running\r
38          */\r
39         boolean isServer()\r
40                 { return isServer; }\r
41         \r
42         /**\r
43          * Attempts to create the server by opening a server socket on the port.\r
44          * @return true if the server was created; false otherwise\r
45          */\r
46         boolean createServer()\r
47         {\r
48                 try\r
49                 {\r
50                         serverSocket = new ServerSocket(PORT);\r
51                         start();                        \r
52                         \r
53                         return isServer = true;\r
54                 }\r
55                 catch (IOException e)\r
56                 {\r
57                         logger.debug("SERVER: " + e);\r
58                         return false;\r
59                 }\r
60         }\r
61         \r
62         /**\r
63          * Thread listening method - loops indefinitely listening for connections.\r
64          * When one is received, the socket object is passed to the manager so it\r
65          * can make a full client connection for further comms.\r
66          */\r
67         public void run()\r
68         {\r
69                 logger.debug("SERVER: listening on " + PORT + " - SERVER");\r
70                 \r
71                 // Loop forever, accepting connectons from other clients\r
72                 // TODO: add in the ability to terminate the server if a VAMSAS session\r
73                 // is ended\r
74                 while (isAlive)\r
75                 {\r
76                         try\r
77                         {\r
78                                 Socket socket = serverSocket.accept();                          \r
79                                 logger.info("SERVER: connection detected");\r
80                                 if (isAlive)\r
81                                         manager.addEndPoint(socket);\r
82                         }\r
83                         catch (IOException e) {}\r
84                 }\r
85         }\r
86         \r
87         void terminate()\r
88         {\r
89                 logger.debug("Server shutting down...");\r
90                 isAlive=false;\r
91                 try { serverSocket.close(); }\r
92                 catch (Exception e)\r
93                 {\r
94                         logger.error(e);\r
95                 }\r
96     logger.debug("Server shut down complete.");\r
97         }\r
98 }