org.klomp.snark
Class Peer

java.lang.Object
  extended by 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()