backtrack
[vamsas.git] / src / org / vamsas / client / picking / PickEndPoint.java
1 package org.vamsas.client.picking;\r
2 \r
3 import java.io.*;\r
4 import java.net.*;\r
5 \r
6 class PickEndPoint extends Thread\r
7 {\r
8         private Socket socket;\r
9         private int rPort;\r
10         private BufferedWriter os;\r
11         private BufferedReader in;\r
12 \r
13         private PickManager manager;    \r
14         \r
15         PickEndPoint(PickManager manager, Socket s)\r
16         {\r
17                 this.manager = manager;\r
18                 socket = s;\r
19         }\r
20         \r
21         boolean openConnection()\r
22         {\r
23                 try\r
24                 {\r
25                         // Create the socket if it doesn't already exist\r
26                         if (socket == null)\r
27                                 socket = new Socket(InetAddress.getLocalHost(), PickServer.PORT);\r
28                         \r
29                         rPort = socket.getPort();\r
30                         socket.setKeepAlive(true);\r
31                                                 \r
32                         // Open the streams for reading/writing\r
33                         os = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));\r
34                         in = new BufferedReader(new InputStreamReader(socket.getInputStream()));\r
35                 \r
36                         // Start the thread to listen for incoming messages\r
37                         System.out.println("CLIENT: connection successful to port "\r
38                                 + socket.getPort() + " via port " + socket.getLocalPort());\r
39                         start();\r
40                         \r
41                         return true;\r
42                 }\r
43                 catch (Exception e)\r
44                 {\r
45                         System.out.println("CLIENT: connection failed: " + e);\r
46                         return false;\r
47                 }\r
48         }\r
49         \r
50         void send(String str)\r
51         {\r
52                 try\r
53                 {\r
54                         System.out.println("CLIENT: send " + str + " to " + rPort);\r
55                         os.write(str);\r
56                         \r
57                         // We use a newline to terminate the message\r
58                         os.newLine();\r
59                         os.flush();\r
60                 }\r
61                 catch (Exception e)\r
62                 {\r
63                         System.out.println("CLIENT: failed to send");\r
64                         \r
65                         // TODO: terminate the connection on a failed send or retry?\r
66                         terminate();\r
67                 }\r
68         }\r
69         \r
70         // void receive() (threaded)\r
71         public void run()\r
72         {\r
73                 try\r
74                 {\r
75                         while (true)\r
76                         {\r
77                                 String str = in.readLine();                             \r
78                                 System.out.println("CLIENT: recv " + str + " from " + rPort);\r
79                                 \r
80                                 manager.handleMessage(this, str);\r
81                         }\r
82                 }\r
83                 catch (Exception e)\r
84                 {\r
85                         // Means the other end of the connection has (probably died) so we need\r
86                         // terminate this endpoint (if this is server side)\r
87                         System.out.println("CLIENT: read failed: " + e);\r
88                                                 \r
89                         terminate();\r
90                 }\r
91         }\r
92         \r
93         private void terminate()\r
94         {\r
95                 try { socket.close(); }\r
96                 catch (IOException e) {}\r
97                 \r
98                 System.out.println("CLIENT: closing connection to port " + socket.getPort());\r
99                 manager.removeEndPoint(this);\r
100         }\r
101 }