Class I2PTunnelRunner

All Implemented Interfaces:
Runnable, I2PSocket.SocketErrorListener, LimitOutputStream.DoneCallback
Direct Known Subclasses:
I2PTunnelHTTPClientRunner

public class I2PTunnelRunner extends I2PAppThread implements I2PSocket.SocketErrorListener, LimitOutputStream.DoneCallback
A thread that starts one more thread if keepAliveSocket is false, to forward traffic in each direction. When keepAliveSocket is true, we do not expect additional data and do not need a forwarding thread from the socket to I2P. Warning - not maintained as a stable API for external use.
  • Field Details

    • _log

      protected final Log _log
    • MAX_PACKET_SIZE

      static int MAX_PACKET_SIZE
      max bytes streamed in a packet - smaller ones might be filled up to this size. Larger ones are not split (at least not on Sun's impl of BufferedOutputStream), but that is the streaming api's job...
    • NETWORK_BUFFER_SIZE

      static final int NETWORK_BUFFER_SIZE
    • _keepAliveI2P

      protected volatile boolean _keepAliveI2P
    • _keepAliveSocket

      protected volatile boolean _keepAliveSocket
  • Constructor Details

    • I2PTunnelRunner

      @Deprecated public I2PTunnelRunner(Socket s, I2PSocket i2ps, Object slock, byte[] initialI2PData, List<I2PSocket> sockList)
      Deprecated.
      use FailCallback constructor
      Starts itself
      Parameters:
      slock - the socket lock, non-null
      initialI2PData - may be null
      sockList - may be null. Caller must add i2ps to the list! It will be removed here on completion. Will synchronize on slock when removing.
    • I2PTunnelRunner

      @Deprecated public I2PTunnelRunner(Socket s, I2PSocket i2ps, Object slock, byte[] initialI2PData, byte[] initialSocketData, List<I2PSocket> sockList)
      Deprecated.
      use FailCallback constructor
      Starts itself
      Parameters:
      slock - the socket lock, non-null
      initialI2PData - may be null
      initialSocketData - may be null
      sockList - may be null. Caller must add i2ps to the list! It will be removed here on completion. Will synchronize on slock when removing.
    • I2PTunnelRunner

      @Deprecated public I2PTunnelRunner(Socket s, I2PSocket i2ps, Object slock, byte[] initialI2PData, List<I2PSocket> sockList, Runnable onTimeout)
      Deprecated.
      use FailCallback constructor
      Starts itself
      Parameters:
      slock - the socket lock, non-null
      initialI2PData - may be null
      sockList - may be null. Caller must add i2ps to the list! It will be removed here on completion. Will synchronize on slock when removing.
      onTimeout - May be null. If non-null and no data (except initial data) was received, it will be run before closing s.
    • I2PTunnelRunner

      @Deprecated public I2PTunnelRunner(Socket s, I2PSocket i2ps, Object slock, byte[] initialI2PData, byte[] initialSocketData, List<I2PSocket> sockList, Runnable onTimeout)
      Deprecated.
      use FailCallback constructor
      Starts itself
      Parameters:
      slock - the socket lock, non-null
      initialI2PData - may be null
      initialSocketData - may be null
      sockList - may be null. Caller must add i2ps to the list! It will be removed here on completion. Will synchronize on slock when removing.
      onTimeout - May be null. If non-null and no data (except initial data) was received, it will be run before closing s.
    • I2PTunnelRunner

      public I2PTunnelRunner(Socket s, I2PSocket i2ps, Object slock, byte[] initialI2PData, byte[] initialSocketData, List<I2PSocket> sockList, I2PTunnelRunner.FailCallback onFail)
      Recommended new constructor. Does NOT start itself. Caller must call start().
      Parameters:
      slock - the socket lock, non-null
      initialI2PData - may be null
      initialSocketData - may be null
      sockList - may be null. Caller must add i2ps to the list! It will be removed here on completion. Will synchronize on slock when removing.
      onFail - May be null. If non-null and no data (except initial data) was received, it will be run before closing s.
    • I2PTunnelRunner

      public I2PTunnelRunner(Socket s, I2PSocket i2ps, Object slock, byte[] initialI2PData, byte[] initialSocketData, List<I2PSocket> sockList, I2PTunnelRunner.FailCallback onFail, boolean keepAliveI2P, boolean keepAliveSocket)
      With keepAlive args. Does NOT start itself. Caller must call start().
      Parameters:
      slock - the socket lock, non-null
      initialI2PData - may be null
      initialSocketData - may be null
      sockList - may be null. Caller must add i2ps to the list! It will be removed here on completion. Will synchronize on slock when removing.
      onFail - May be null. If non-null and no data (except initial data) was received, it will be run before closing s.
      keepAliveI2P - Do not close the I2P socket when done.
      keepAliveSocket - Do not close the local socket when done. For client side only; must be false for server side. NO data will be forwarded from the socket to the i2psocket other than initialI2PData if this is true.
      Since:
      0.9.62
  • Method Details

    • isFinished

      @Deprecated public boolean isFinished()
      Deprecated.
      unused
      have we closed at least one (if not both) of the streams [aka we're done running the streams]?
    • getLastActivityOn

      @Deprecated public long getLastActivityOn()
      Deprecated.
      unused
      When was the last data for this runner sent or received? As of 0.9.20, returns -1 always!
      Returns:
      date (ms since the epoch), or -1 if no data has been transferred yet
    • getStartedOn

      public long getStartedOn()
      When this runner started up transferring data
    • setSuccessCallback

      public void setSuccessCallback(I2PTunnelRunner.SuccessCallback sc)
      Will be called if we get any data back. This is called after the first byte of data is received, not on completion. Only one of SuccessCallback, onTimeout, or onFail will be called.
      Since:
      0.9.39
    • getSocketIn

      protected InputStream getSocketIn() throws IOException
      Throws:
      IOException
    • getSocketOut

      protected OutputStream getSocketOut() throws IOException
      Throws:
      IOException
    • getKeepAliveI2P

      boolean getKeepAliveI2P()
      Should we keep the I2P socket open when done? On the client side, only true if the browser and the server side support it. On the server side, only true if the client supports it.
      Since:
      0.9.62
    • getKeepAliveSocket

      boolean getKeepAliveSocket()
      Should we keep the local browser/server socket open when done? Usually true for client side. Always false for server side.
      Since:
      0.9.62
    • streamDone

      public void streamDone()
      The DoneCallback for the I2P socket.
      Specified by:
      streamDone in interface LimitOutputStream.DoneCallback
      Since:
      0.9.62
    • run

      public void run()
      Specified by:
      run in interface Runnable
      Overrides:
      run in class I2PThread
    • close

      protected void close(OutputStream out, InputStream in, OutputStream i2pout, InputStream i2pin, Socket s, I2PSocket i2ps, Thread t1, Thread t2) throws InterruptedException
      Warning - overridden in I2PTunnelHTTPClientRunner. Here we ignore keepalive and always close both sides. The HTTP flavor handles keepalive.
      Parameters:
      out - may be null
      in - may be null
      i2pout - may be null
      i2pin - may be null
      t1 - may be null
      t2 - may be null, ignored, we only join t1
      Throws:
      InterruptedException
    • errorOccurred

      @Deprecated public void errorOccurred()
      Deprecated.
      unused
      Deprecated, unimplemented in streaming, never called.
      Specified by:
      errorOccurred in interface I2PSocket.SocketErrorListener