package net.sourceforge.pain.network.console.telnet; import net.sourceforge.pain.util.*; import java.net.*; import java.util.*; public class TelnetConsoleServer implements Runnable { private ServerSocket serverSocket; private int port; private Set connections = Collections.synchronizedSet(new HashSet()); private boolean started; public TelnetConsoleServer(int port) { Log.info("TelnetConsoleServer created"); this.port = port; Thread worker = new Thread(this); worker.setDaemon(true); worker.start(); } public void run() { started = true; work(); } public void work() { ConnectionChecker checker = new ConnectionChecker(); Thread checkThread = new Thread(checker); checkThread.setDaemon(true); checkThread.start(); try { Log.info("TelnetConsoleServer:creating server socket on port:" + port); serverSocket = new ServerSocket(port, 50); serverSocket.setSoTimeout(0); Log.info("Server Initialised. listening..."); do { try { Socket socket = serverSocket.accept(); Log.debug("TelnetConsoleServer:connection accepted[" + connections.size() + "]:" + socket.getInetAddress()); TelnetConsoleAdapter con = new TelnetConsoleAdapter(this, socket); connections.add(con); Thread worker = new Thread(con); worker.start(); } catch (Exception e) { e.printStackTrace(); } } while (started); } catch (Exception e) { e.printStackTrace(); } finally { checker.interrupted = true; checkThread.interrupt(); } } protected void onClose(TelnetConsoleAdapter con) { Log.debug("TelnetConsoleServer:closing connection:[" + connections.size() + "]" + con.socket.getInetAddress()); connections.remove(con); } public void stop() { started = false; } private class ConnectionChecker implements Runnable { public static final int CHECK_TIMEOUT = 5000; boolean interrupted = false; public void run() { while (!interrupted) { try { Collection c = new ArrayList(connections); long checkBarrier = System.currentTimeMillis() - CHECK_TIMEOUT; for (Iterator it = c.iterator(); it.hasNext();) { TelnetConsoleAdapter con = (TelnetConsoleAdapter) it.next(); if (con.lastFlushTime < checkBarrier) { Log.debug("TelnetConsoleServer:AYT to " + con.socket.getRemoteSocketAddress()); con.ping(); } } Thread.sleep(CHECK_TIMEOUT); } catch (InterruptedException e) { interrupted = true; } catch (Exception e) { Log.error(e.getMessage(), e); } } } } }