Ik ben eindelijk in de eerste testfase aanbeland van mijn project, maar ik loop opeens tegen een onverwachte fout aan, en ik zie niet waarom.
Ik heb een zgn Controller die connecties ontvangt, en deze dan doorgeeft aan een andere thread om het af te handelen. Alleen het probleem: zover komt hij niet eens. Al op de eerste ServerSocket.accept() krijg ik een SocketException met de melding "ServerSocket is closed".
De relevante code:
Controller:
Ik zie het niet meer, iemand anders wel?
Ik heb een zgn Controller die connecties ontvangt, en deze dan doorgeeft aan een andere thread om het af te handelen. Alleen het probleem: zover komt hij niet eens. Al op de eerste ServerSocket.accept() krijg ik een SocketException met de melding "ServerSocket is closed".
De relevante code:
Controller:
Java:
De verzendende kant: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
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
| public void run() { try { server = new ServerSocket(port); // port is een private int field server.setSoTimeout(timeout); // timeout is een private int field if (Kernel.DEBUGGING) // als we aan het debuggen zijn { System.out.println("- Controller server socket created"); } } catch (IOException e) { System.err.println("Error creating server socket."); return; } running = true; // private boolean field Socket socket = null; // de socket die het verder afhandelt. ObjectInputStream in = null; // inputstream van socket Action action = null; // klasse die overgestuurd wordt while (running) { waitForNextPeriod(); // javax.realtime method, voor periodieke executies try { try { socket = server.accept(); // <- hier gaat het fout! if (Kernel.DEBUGGING) { System.out.println("- Controller got connection"); } } catch (SocketTimeoutException e) { // timeout occurred, skip to next if (Kernel.DEBUGGING) { System.out.println("- Controller: timeout"); } continue; } in = new ObjectInputStream(socket.getInputStream()); // the first action is a dummy action. action = (Action)in.readObject(); if (Kernel.DEBUGGING) { System.out.println("- Controller: got first action: " + action); } // afhandeling van action } catch (IOException e) { System.err.println(e); // en deze komt dus tig keer voorbij } catch (ClassNotFoundException e) { System.err.println(e); } } } |
Java:
De controller leest dus eerst een dummy action, gevolgd door de echte read action; write action. Dit doe ik om niet steeds weer voor 1 bericht een connectie te maken terwijl ik die periodiek nodig heb. Zover komt het alleen niet eens, want de allereerste getIO in de zendende kant gaat niet eens goed.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
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
| private static class ConnectionIO // class als encapsulatie van in en out, voor in een map { public ObjectInputStream in; public ObjectOutputStream out; public ConnectionIO(ObjectInputStream in, ObjectOutputStream out) { this.in = in; this.out = out; } } private ConnectionIO getIO(Action action) { // connections is een map van action naar io ConnectionIO io = (ConnectionIO)connections.get(action); if (io == null) // eerste keer, creeer de socket { try { Socket socket = new Socket("localhost", port); // hier bestaat socket wel! io = new ConnectionIO( new ObjectInputStream(socket.getInputStream()), new ObjectOutputStream(socket.getOutputStream()) ); connections.put(action, io); // write an initial dummy action io.out.writeObject(action); } catch (IOException e) { System.err.println(e); } } return io; } public Tuple read(Tuple template) { Action action = new Action(Action.READ, template); ConnectionIO io = getIO(action); // in getIO krijgt de client een NullPointerConnection // op Socket.connect(SocketAddress, int) try { io.out.writeObject(action); /* * Wait for the return; since actions are periodic, it will occur * before a new equal action. */ return (Tuple)io.in.readObject(); } catch (IOException e) { System.err.println(e); } catch (ClassNotFoundException e) { // Should not occur, since the type will be the same as template. System.err.println(e); } return null; } |
Ik zie het niet meer, iemand anders wel?
More than meets the eye
There is no I in TEAM... but there is ME
system specs