import java.net.*; import java.io.*; public class Connection extends Thread { private boolean connected; private boolean interrupted; private String ip; private int port; private Socket socket; private PrintWriter out; private BufferedReader in; public Connection(String ip, int port, String threadName) { super(threadName); connected = false; interrupted = false; socket = null; this.ip = ip; this.port = port; } public Connection(Socket socket, String threadName) { super(threadName); connected = false; interrupted = false; this.socket = socket; } public static boolean isConnected(Connection obj) { return obj != null && obj.connected; } protected PrintWriter getOut() { return out; } protected BufferedReader getIn() { return in; } public void interrupt() { interrupted = true; } public void closeConnection() { try { if(connected) { connected = false; socket.close(); out.close(); in.close(); } } catch(IOException ioe) { ioe.printStackTrace(); } } protected void sendMessage(MessageType type, String input) { out.println(type); out.println(input); } protected void processMessage(MessageType type, String input) { } protected void connectionStart() { } protected void connectionSuccess() { } protected void connectionFailure() { } protected void connectionBreak() { } protected void peerDisconnect() { } protected void connectionEnd() { } public void run() { String strType, str; try { connectionStart(); if(socket == null) socket = new Socket(ip, port); if(!interrupted) { out = new PrintWriter(socket.getOutputStream(), true); in = new BufferedReader(new InputStreamReader(socket.getInputStream())); connected = true; connectionSuccess(); } }catch (UnknownHostException uhe) { if(!interrupted) connectionFailure(); }catch (ConnectException ce) { if(!interrupted) connectionFailure(); }catch(IOException ioe) { if(!interrupted) ioe.printStackTrace(); } if(interrupted) closeConnection(); try{ while(connected && (strType = in.readLine()) != null && (str = in.readLine()) != null) { processMessage(MessageType.valueOf(strType), str); } if(connected) peerDisconnect(); }catch(SocketException se) { if(connected) connectionBreak(); }catch(IOException ioe) { ioe.printStackTrace(); } closeConnection(); connectionEnd(); } }