org.klomp.snark

## Class Peer

- java.lang.Object
- - org.klomp.snark.Peer

- All Implemented Interfaces:
    Comparable

      public class Peer
      extends Object
      implements Comparable

- - ### Field Summary

    Fields
    Modifier and Type | Field and Description
    --- | ---
    `(package private) static long` | `CHECK_PERIOD`
    `(package private) MagnetState` | `magnetState` shared across all peers on this torrent
    `(package private) static long` | `OPTION_AZMP`
    `(package private) static long` | `OPTION_DHT`
    `(package private) static long` | `OPTION_EXTENSION`
    `(package private) static long` | `OPTION_FAST`
    `(package private) static long` | `OPTION_I2P_DHT` we use a different bit since the compact format is different
    `(package private) static int` | `RATE_DEPTH`
    `(package private) PeerState` | `state`

  - ### Constructor Summary

    Constructors
    Constructor and Description
    `Peer(I2PSocket sock, InputStream in, OutputStream out, byte[] my_id, byte[] infohash, MetaInfo metainfo)` Incoming connection.
    `Peer(PeerID peerID, byte[] my_id, byte[] infohash, MetaInfo metainfo)` Outgoing connection.

  - ### Method Summary

    Methods
    Modifier and Type | Method and Description
    --- | ---
    `(package private) void` | `cancel(int piece)` Tell the other side that we are no longer interested in any of the outstanding requests (if any) for this piece.
    `int` | `compareTo(Object o)` Deprecated. unused?
    `int` | `completed()` Return how much the peer has
    `(package private) void` | `disconnect()`
    `void` | `disconnect(boolean deregister)` Disconnects this peer if it was connected.
    `void` | `downloaded(int size)` Increment the counter.
    `boolean` | `equals(Object o)` Two Peers are equal when they have the same PeerID.
    `Destination` | `getDestination()`
    `long` | `getDownloaded()` Returns the number of bytes that have been downloaded.
    `long` | `getDownloadRate()`
    `Map<String,BEValue>` | `getHandshakeMap()`
    `long` | `getInactiveTime()`
    `MagnetState` | `getMagnetState()` Shared state across all peers, callers must sync on returned object
    `long` | `getOptions()`
    `PeerID` | `getPeerID()` Returns the id of the peer.
    `String` | `getSocket()`
    `long` | `getUploaded()` Returns the number of bytes that have been uploaded.
    `long` | `getUploadRate()` Returns the 4-minute-average rate in Bps
    `int` | `hashCode()` The hash code of a Peer is the hash code of the peerID.
    `void` | `have(int piece)` Tell the peer we have another piece.
    `boolean` | `isChoked()` Whether or not the peer choked us.
    `boolean` | `isChoking()` Whether or not we are choking the peer.
    `boolean` | `isCompleted()` Return if a peer is a seeder
    `boolean` | `isConnected()`
    `boolean` | `isInterested()` Whether or not the peer is interested in pieces we have.
    `boolean` | `isInteresting()` Whether or not the peer has pieces we want from it.
    `(package private) boolean` | `isRequesting(int p)` Deprecated. deadlocks
    `void` | `keepAlive()` Send keepalive
    `(package private) void` | `request()` Update the request queue.
    `void` | `resetCounters()` Resets the downloaded and uploaded counters to zero.
    `void` | `retransmitRequests()` Retransmit outstanding requests if necessary
    `void` | `runConnection(I2PSnarkUtil util, PeerListener listener, BitField bitfield, MagnetState mState)` Runs the connection to the other peer.
    `void` | `sendExtension(int type, byte[] payload)`
    `void` | `setChoking(boolean choke)` Sets whether or not we are choking the peer.
    `void` | `setHandshakeMap(Map<String,BEValue> map)`
    `void` | `setInteresting(boolean interest)` Deprecated. unused
    `void` | `setMetaInfo(MetaInfo meta)` Switch from magnet mode to normal mode
    `void` | `setRateHistory(long up, long down)` Push the total uploaded/downloaded onto a RATE_DEPTH deep stack
    `String` | `toString()` Returns the String representation of the peerID.
    `void` | `uploaded(int size)` Increment the counter.

    - ### Methods inherited from class java.lang.Object

      `clone, finalize, getClass, notify, notifyAll, wait, wait, wait`

- - ### Field Detail

    - #### state

          PeerState state

    - #### magnetState

          MagnetState magnetState

      shared across all peers on this torrent

    - #### CHECK_PERIOD

          static final long CHECK_PERIOD

      See Also:
        Constant Field Values

    - #### RATE_DEPTH

          static final int RATE_DEPTH

      See Also:
        Constant Field Values

    - #### OPTION_EXTENSION

          static final long OPTION_EXTENSION

      See Also:
        Constant Field Values

    - #### OPTION_FAST

          static final long OPTION_FAST

      See Also:
        Constant Field Values

    - #### OPTION_DHT

          static final long OPTION_DHT

      See Also:
        Constant Field Values

    - #### OPTION_I2P_DHT

          static final long OPTION_I2P_DHT

      we use a different bit since the compact format is different
      See Also:
        Constant Field Values

    - #### OPTION_AZMP

          static final long OPTION_AZMP

      See Also:
        Constant Field Values

  - ### Constructor Detail

    - #### Peer

          public Peer(PeerID peerID,
              byte[] my_id,
              byte[] infohash,
              MetaInfo metainfo)

      Outgoing connection. Creates a disconnected peer given a PeerID, your own id and the relevant MetaInfo.
      Parameters:
        `metainfo` - null if in magnet mode

    - #### Peer

          public Peer(I2PSocket sock,
              InputStream in,
              OutputStream out,
              byte[] my_id,
              byte[] infohash,
              MetaInfo metainfo)
               throws IOException

      Incoming connection. Creates a unconnected peer from the input and output stream got from the socket. Note that the complete handshake (which can take some time or block indefinitely) is done in the calling Thread to get the remote peer id. To completely start the connection call the connect() method.
      Parameters:
        `metainfo` - null if in magnet mode
      Throws:
        `IOException` - when an error occurred during the handshake.

  - ### Method Detail

    - #### getPeerID

          public PeerID getPeerID()

      Returns the id of the peer.

    - #### toString

          public String toString()

      Returns the String representation of the peerID.
      Overrides:
        `toString` in class `Object`

    - #### getSocket

          public String getSocket()

      Returns:
        socket debug string (for debug printing)

    - #### hashCode

          public int hashCode()

      The hash code of a Peer is the hash code of the peerID.
      Overrides:
        `hashCode` in class `Object`

    - #### equals

          public boolean equals(Object o)

      Two Peers are equal when they have the same PeerID. All other properties are ignored.
      Overrides:
        `equals` in class `Object`

    - #### compareTo

          public int compareTo(Object o)

      Deprecated. unused?
      Compares the PeerIDs.
      Specified by:
        `compareTo` in interface `Comparable`

    - #### runConnection

          public void runConnection(I2PSnarkUtil util,
                           PeerListener listener,
                           BitField bitfield,
                           MagnetState mState)

      Runs the connection to the other peer. This method does not return until the connection is terminated. When the connection is correctly started the connected() method of the given PeerListener is called. If the connection ends or the connection could not be setup correctly the disconnected() method is called. If the given BitField is non-null it is send to the peer as first message.

    - #### getOptions

          public long getOptions()

      Since:
        0.8.4

    - #### getDestination

          public Destination getDestination()

      Since:
        0.8.4

    - #### getMagnetState

          public MagnetState getMagnetState()

      Shared state across all peers, callers must sync on returned object
      Returns:
        non-null
      Since:
        0.8.4

    - #### getHandshakeMap

          public Map<String,BEValue> getHandshakeMap()

      Returns:
        could be null @since 0.8.4

    - #### setHandshakeMap

          public void setHandshakeMap(Map<String,BEValue> map)

      Since:
        0.8.4

    - #### sendExtension

          public void sendExtension(int type,
                           byte[] payload)

      Since:
        0.8.4

    - #### setMetaInfo

          public void setMetaInfo(MetaInfo meta)

      Switch from magnet mode to normal mode
      Since:
        0.8.4

    - #### isConnected

          public boolean isConnected()

    - #### disconnect

          public void disconnect(boolean deregister)

      Disconnects this peer if it was connected. If deregister is true, PeerListener.disconnected() will be called when the connection is completely terminated. Otherwise the connection is silently terminated.

    - #### disconnect

          void disconnect()

    - #### have

          public void have(int piece)

      Tell the peer we have another piece.

    - #### cancel

          void cancel(int piece)

      Tell the other side that we are no longer interested in any of the outstanding requests (if any) for this piece.
      Since:
        0.8.1

    - #### isRequesting

          boolean isRequesting(int p)

      Deprecated. deadlocks
      Are we currently requesting the piece?
      Since:
        0.8.1

    - #### request

          void request()

      Update the request queue. Call after adding wanted pieces.
      Since:
        0.8.1

    - #### isInterested

          public boolean isInterested()

      Whether or not the peer is interested in pieces we have. Returns false if not connected.

    - #### setInteresting

          public void setInteresting(boolean interest)

      Deprecated. unused
      Sets whether or not we are interested in pieces from this peer. Defaults to false. When interest is true and this peer unchokes us then we start downloading from it. Has no effect when not connected.

    - #### isInteresting

          public boolean isInteresting()

      Whether or not the peer has pieces we want from it. Returns false if not connected.

    - #### setChoking

          public void setChoking(boolean choke)

      Sets whether or not we are choking the peer. Defaults to true. When choke is false and the peer requests some pieces we upload them, otherwise requests of this peer are ignored.

    - #### isChoking

          public boolean isChoking()

      Whether or not we are choking the peer. Returns true when not connected.

    - #### isChoked

          public boolean isChoked()

      Whether or not the peer choked us. Returns true when not connected.

    - #### downloaded

          public void downloaded(int size)

      Increment the counter.
      Since:
        0.8.4

    - #### uploaded

          public void uploaded(int size)

      Increment the counter.
      Since:
        0.8.4

    - #### getDownloaded

          public long getDownloaded()

      Returns the number of bytes that have been downloaded. Can be reset to zero with `resetCounters()`/

    - #### getUploaded

          public long getUploaded()

      Returns the number of bytes that have been uploaded. Can be reset to zero with `resetCounters()`/

    - #### resetCounters

          public void resetCounters()

      Resets the downloaded and uploaded counters to zero.

    - #### getInactiveTime

          public long getInactiveTime()

    - #### keepAlive

          public void keepAlive()

      Send keepalive

    - #### retransmitRequests

          public void retransmitRequests()

      Retransmit outstanding requests if necessary

    - #### completed

          public int completed()

      Return how much the peer has

    - #### isCompleted

          public boolean isCompleted()

      Return if a peer is a seeder

    - #### setRateHistory

          public void setRateHistory(long up,
                            long down)

      Push the total uploaded/downloaded onto a RATE_DEPTH deep stack

    - #### getUploadRate

          public long getUploadRate()

      Returns the 4-minute-average rate in Bps

    - #### getDownloadRate

          public long getDownloadRate()