package net.i2p.i2ptunnel; import java.io.IOException; import java.net.ServerSocket; import java.net.Socket; import net.i2p.util.I2PAppThread; import net.i2p.util.InternalServerSocket; import net.i2p.util.Log; /** * Listen for in-JVM connections on the internal "socket" * * @author zzz * @since 0.7.9 */ class InternalSocketRunner extends I2PAppThread { private final I2PTunnelClientBase client; private final int port; private ServerSocket ss; private volatile boolean open; /** * Does not start the runner, caller must call start() */ InternalSocketRunner(I2PTunnelClientBase client) { super("Internal socket port " + client.getLocalPort()); setDaemon(true); this.client = client; this.port = client.getLocalPort(); } @Override public final void run() { try { this.ss = new InternalServerSocket(this.port); this.open = true; while (this.open) { Socket s = this.ss.accept(); this.client.manageConnection(s); } } catch (IOException ex) { if (this.open) { Log log = new Log(InternalSocketRunner.class); log.error("Error listening for internal connections on port " + this.port, ex); } this.open = false; } } void stopRunning() { if (this.open) { this.open = false; try { this.ss.close(); } catch (IOException ex) {} } } }