package net.sourceforge.pain.network.guitool; import net.sourceforge.pain.util.*; import java.net.*; import java.util.*; public final class GuiToolConnectionServer implements Runnable { private ServerSocket serverSocket; private int port; private Set connections = Collections.synchronizedSet(new HashSet()); private boolean started; GuiToolSessionManager sm = null; public GuiToolConnectionServer(GuiToolSessionManager sm, int port) { Log.info("GuiToolConnectionServer created"); this.sm = sm; this.port = port; Thread worker = new Thread(this); worker.setDaemon(true); worker.start(); } public void run() { started = true; work(); } public void work() { try { Log.info("GTS:creating server socket on port:" + port); serverSocket = new ServerSocket(port, 50, InetAddress.getByName("127.0.0.1")); serverSocket.setSoTimeout(0); Log.info("GTS:Server Initialised. listening..."); do { try { Socket socket = serverSocket.accept(); Log.debug("GTS:connection accepted[" + connections.size() + "]:" + socket.getInetAddress()); GuiToolConnection con = new GuiToolConnection(this, socket); sm.onConnect(con); connections.add(con); Thread worker = new Thread(con); worker.start(); } catch (Exception e) { e.printStackTrace(); } } while (started); } catch (Exception e) { Log.error(e); } } protected void onClose(GuiToolConnection con) { Log.debug("GTS:closing connection:[" + connections.size() + "]" + con.socket.getInetAddress()); connections.remove(con); sm.onDisconnect(con); } public void stop() { started = false; } }