import java.awt.Color; import java.io.IOException; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.net.Socket; /** * class for an individual connection to a client. allows to send messages to * this client and handles incoming messages. */ public class Connection extends Thread { protected Socket socket; protected ObjectInputStream inputStream; protected ObjectOutputStream outputStream; protected Server server; protected String content; protected boolean connectionOpen = true; public Connection(Socket s, Server server) { this.socket = s; try { inputStream = new ObjectInputStream((s.getInputStream())); outputStream = new ObjectOutputStream((s.getOutputStream())); } catch (IOException e) { e.printStackTrace(); } this.server = server; } /** * waits for incoming messages from the socket */ public void run() { String clientName = socket.getInetAddress().toString(); server.broadcast("Server","New User has joined." ,Color.orange); try { while (connectionOpen) { try { Object msg = inputStream.readObject(); handleIncomingMessage(clientName, msg); } catch (ClassNotFoundException e) { e.printStackTrace(); } } } catch (IOException ex) { ex.printStackTrace(); } finally { server.removeConnection(this); server.broadcast("Server","User has left.",Color.orange); try { socket.close(); } catch (IOException ex) { ex.printStackTrace(); } } } /** * decides what to do with incoming messages * * @param name * name of the client * @param msg * received message */ protected void handleIncomingMessage(String name, Object msg) { if (msg instanceof AuthMessage) //check if it is a password message { if (((AuthMessage) msg).getContent().equals(this.server.getPassword())) { AuthMessage m = new AuthMessage("Server","OK"); this.send(m); } else { server.removeConnection(this); content = "Authentication failed!! User is kicked."; server.broadcast("Server" ,content ,Color.orange); try { socket.close(); } catch (IOException ex) { ex.printStackTrace(); } } } if (msg instanceof TextMessage) { content = ((TextMessage) msg).getSender() + ": " + ((TextMessage) msg).getContent(); server.broadcast(((TextMessage) msg).getSender(), ((TextMessage) msg).getContent() ,((TextMessage) msg).getColor()); } } /** * sends a message to the client * * @param line * text of the message */ public void send(String from, String line, Color c) { send(new TextMessage(from, line, c)); } public void send(Message msg) { try { synchronized (outputStream) { outputStream.writeObject(msg); } outputStream.flush(); } catch (IOException ex) { connectionOpen = false; } } }