package grafikchat.model; import grafikchat.ohmlogger.OhmLogger; import java.io.IOException; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.net.ServerSocket; import java.net.Socket; import java.util.Observable; import java.util.Observer; import java.util.logging.Logger; /** * TCP Server * * @author marian */ public class Server extends Observable implements Runnable, Transceiver { private int port; private ServerSocket server; private Socket client; private static Logger logger = OhmLogger.getLogger(); private ObjectInputStream reader; private ObjectOutputStream writer; private volatile boolean ready; private Thread thd; /** * Constructor, initialize variables * @param port Port to listen on */ public Server(int port) { this.port = port; this.server = null; this.client = null; this.reader = null; this.writer = null; this.ready = false; this.thd = null; } /** * Init server if not already done */ @Override public void init() { if (thd == null) { thd = new Thread(this); thd.start(); } } /** * Add observer to server * @param o Observer to add */ @Override public void registerObserver(Observer o) { this.addObserver(o); } /** * Run server in thread */ @Override public void run() { logger.info("Running server..."); while (true) { if (server == null) { try { server = new ServerSocket(port); } catch (IOException e) { logger.severe(e.toString()); return; } logger.info("Waiting for client to connect"); try { client = server.accept(); } catch (IOException e) { logger.severe(e.toString()); return; } logger.info("Client connected"); try { writer = new ObjectOutputStream(client.getOutputStream()); } catch (IOException e) { logger.severe(e.toString()); return; } try { reader = new ObjectInputStream(client.getInputStream()); } catch (IOException e) { logger.severe(e.toString()); return; } ready = true; } if (ready) { try { //logger.info("Waiting for message"); Object o = reader.readObject(); if (o == null) { logger.warning("Reached end of stream"); ready = false; continue; } this.setChanged(); this.notifyObservers(o); } catch (ClassNotFoundException | IOException e) { logger.severe(e.toString()); return; } } } } /** * Send message to client * @param d TransceiverData to transmit */ @Override public void sendMessage(TransceiverData d) { if (ready) { try { writer.writeObject(d); } catch (IOException e) { logger.severe(e.toString()); } } else { logger.warning("Server not ready to send message. Connect first"); } } }