## 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
`(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
`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
`(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()