1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38 package ffx.ui.commands;
39
40 import java.io.InputStream;
41 import java.io.ObjectInputStream;
42 import java.io.ObjectOutputStream;
43 import java.io.OutputStream;
44 import java.net.InetSocketAddress;
45 import java.net.Socket;
46 import java.util.logging.Logger;
47
48
49
50
51
52
53
54 public class FFXClient {
55
56 private static final Logger logger = Logger.getLogger(FFXClient.class.getName());
57 private Socket client;
58 private InetSocketAddress address;
59 private InputStream in;
60 private ObjectInputStream oin;
61 private OutputStream out;
62 private ObjectOutputStream oout;
63 private SimulationDefinition system;
64 private SimulationUpdate update;
65 private SimulationMessage message;
66
67 private int retryCount = 0;
68 private int retryLimit = 10000;
69 private boolean connectionMade = false;
70
71
72
73 private boolean closed = false;
74
75
76 public FFXClient() {
77 address = new InetSocketAddress(2000);
78 }
79
80
81
82
83
84
85 public FFXClient(InetSocketAddress a) {
86 address = a;
87 }
88
89
90
91
92
93
94 public FFXClient(int port) {
95 address = new InetSocketAddress(port);
96 }
97
98
99
100
101
102 public void connect() {
103 if (client != null && client.isConnected()) {
104 release();
105 }
106 closed = false;
107 client = new Socket();
108 try {
109 client.connect(address, 100);
110 client.setTcpNoDelay(true);
111 out = client.getOutputStream();
112 oout = new ObjectOutputStream(out);
113 in = client.getInputStream();
114 oin = new ObjectInputStream(in);
115 connectionMade = true;
116 logger.info("Connected to FFX Server: " + client);
117 } catch (Exception e) {
118 client = null;
119 } finally {
120 if (client == null || !client.isConnected()) {
121 release();
122 }
123 }
124 }
125
126
127
128
129
130
131 public SimulationDefinition getSystem() {
132 readSocket();
133 return system;
134 }
135
136
137
138
139
140
141 public SimulationUpdate getUpdate() {
142 readSocket();
143 return update;
144 }
145
146
147
148
149
150
151 public boolean isClosed() {
152 return closed;
153 }
154
155
156
157
158
159
160 public boolean isConnected() {
161 if (client != null && client.isConnected()) {
162 return true;
163 }
164 return false;
165 }
166
167
168 public void readSocket() {
169 try {
170 while (oin != null && in.available() > 0) {
171 Object o = oin.readObject();
172 if (o instanceof SimulationMessage) {
173 message = (SimulationMessage) o;
174
175 if (message.getMessage() == SimulationMessage.SYSTEM) {
176 system = (SimulationDefinition) oin.readObject();
177 system.read = false;
178 } else if (message.getMessage() == SimulationMessage.UPDATE) {
179 update = (SimulationUpdate) oin.readObject();
180 update.read = false;
181 } else if (message.getMessage() == SimulationMessage.CLOSING) {
182 closed = true;
183 release();
184 }
185 }
186 }
187 if (system == null) {
188 message = new SimulationMessage(SimulationMessage.SYSTEM);
189 oout.reset();
190 oout.writeObject(message);
191 oout.flush();
192 } else if (update == null || update.read) {
193 message = new SimulationMessage(SimulationMessage.UPDATE);
194 if (update != null) {
195 if (update.type == SimulationUpdate.SIMULATION) {
196 message.setTime(update.time);
197 } else {
198 message.setStep(update.step);
199 }
200 }
201 oout.reset();
202 oout.writeObject(message);
203 oout.flush();
204 }
205 } catch (Exception e) {
206 logger.warning("Exception reading data from FFX\n" + e);
207 release();
208 }
209 }
210
211
212 public void release() {
213 if (client == null) {
214 return;
215 }
216 retryCount++;
217 if (retryCount > retryLimit || connectionMade) {
218 closed = true;
219 }
220 if (client != null && client.isConnected() && oout != null) {
221 try {
222 SimulationMessage close = new SimulationMessage(SimulationMessage.CLOSING);
223 oout.reset();
224 oout.writeObject(close);
225 oout.flush();
226 } catch (Exception e) {
227 oout = null;
228 }
229 }
230 try {
231 if (oin != null) {
232 oin.close();
233 }
234 if (in != null) {
235 in.close();
236 }
237 if (oout != null) {
238 oout.close();
239 }
240 if (out != null) {
241 out.close();
242 }
243 if (client != null) {
244 client.close();
245 }
246 } catch (Exception e) {
247 client = null;
248 } finally {
249 in = null;
250 oin = null;
251 out = null;
252 oout = null;
253 client = null;
254 }
255 }
256 }