package uk.ac.vamsas.client.picking; import java.io.*; import java.net.*; class PickEndPoint extends Thread { private Socket socket; private int rPort; private BufferedWriter os; private BufferedReader in; private PickManager manager; PickEndPoint(PickManager manager, Socket s) { this.manager = manager; socket = s; } boolean openConnection() { try { // Create the socket if it doesn't already exist if (socket == null) socket = new Socket(InetAddress.getLocalHost(), PickServer.PORT); rPort = socket.getPort(); socket.setKeepAlive(true); // Open the streams for reading/writing os = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())); in = new BufferedReader(new InputStreamReader(socket.getInputStream())); // Start the thread to listen for incoming messages System.out.println("CLIENT: connection successful to port " + socket.getPort() + " via port " + socket.getLocalPort()); start(); return true; } catch (Exception e) { System.out.println("CLIENT: connection failed: " + e); return false; } } void send(String str) { try { System.out.println("CLIENT: send " + str + " to " + rPort); os.write(str); // We use a newline to terminate the message os.newLine(); os.flush(); } catch (Exception e) { System.out.println("CLIENT: failed to send"); // TODO: terminate the connection on a failed send or retry? terminate(); } } // void receive() (threaded) public void run() { try { while (true) { String str = in.readLine(); System.out.println("CLIENT: recv " + str + " from " + rPort); manager.handleMessage(this, str); } } catch (Exception e) { // Means the other end of the connection has (probably died) so we need // terminate this endpoint (if this is server side) System.out.println("CLIENT: read failed: " + e); terminate(); } } private void terminate() { try { socket.close(); } catch (IOException e) {} System.out.println("CLIENT: closing connection to port " + socket.getPort()); manager.removeEndPoint(this); } }