Package org.klomp.snark
Class Peer
java.lang.Object
org.klomp.snark.Peer
- All Implemented Interfaces:
Comparable<Peer>
- Direct Known Subclasses:
WebPeer
public class Peer extends Object implements Comparable<Peer>
-
Field Summary
Fields Modifier and Type Field Description protected Log
_log
(package private) static long
CHECK_PERIOD
(package private) MagnetState
magnetState
shared across all peers on this torrentprotected MetaInfo
metainfo
will start out null in magnet mode(package private) static int
RATE_DEPTH
(package private) PeerState
state
` Keeps state for in/out connections. -
Constructor Summary
Constructors Constructor 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
Modifier and Type Method 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(Peer p)
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 objectlong
getMaxInactiveTime()
int
getMaxPipeline()
PeerID
getPeerID()
Returns the id of the peer.String
getSocket()
(package private) int
getTotalCommentsSent()
long
getUploaded()
Returns the number of bytes that have been uploaded.long
getUploadRate()
Returns the 4-minute-average rate in Bpsint
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 seederboolean
isConnected()
boolean
isIncoming()
Is this an incoming connection? For RPCboolean
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.deadlocksboolean
isWebPeer()
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 necessaryvoid
runConnection(I2PSnarkUtil util, PeerListener listener, BitField bitfield, MagnetState mState, boolean uploadOnly)
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.unusedvoid
setMetaInfo(MetaInfo meta)
Switch from magnet mode to normal modevoid
setRateHistory(long up, long down)
Push the total uploaded/downloaded onto a RATE_DEPTH deep stack(package private) void
setTotalCommentsSent(int count)
boolean
supportsFast()
String
toString()
Returns the String representation of the peerID.void
uploaded(int size)
Increment the counter.
-
Field Details
-
_log
-
metainfo
will start out null in magnet mode -
state
` Keeps state for in/out connections. Non-null when the handshake was successful, the connection setup and runs. Do not access directly. All actions should be through Peer methods. -
magnetState
MagnetState magnetStateshared 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
-
-
Constructor Details
-
Peer
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 IOExceptionIncoming 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 Details
-
isIncoming
public boolean isIncoming()Is this an incoming connection? For RPC- Since:
- 0.9.30
-
getPeerID
Returns the id of the peer. -
toString
Returns the String representation of the peerID. -
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. -
equals
Two Peers are equal when they have the same PeerID. All other properties are ignored. -
compareTo
Deprecated.unused?Compares the PeerIDs.- Specified by:
compareTo
in interfaceComparable<Peer>
-
runConnection
public void runConnection(I2PSnarkUtil util, PeerListener listener, BitField bitfield, MagnetState mState, boolean uploadOnly)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.- Parameters:
uploadOnly
- if we are complete with skipped files, i.e. a partial seed
-
supportsFast
public boolean supportsFast()- Since:
- 0.9.21
-
getDestination
- Since:
- 0.8.4
-
getMagnetState
Shared state across all peers, callers must sync on returned object- Returns:
- non-null
- Since:
- 0.8.4
-
getHandshakeMap
- Returns:
- could be null @since 0.8.4
-
setHandshakeMap
- Parameters:
map
- non-null- Since:
- 0.8.4
-
getMaxPipeline
public int getMaxPipeline()- Returns:
- min of PeerState.MIN_PIPELINE, max of PeerState.MAX_PIPELINE
- Since:
- 0.9.47
-
sendExtension
public void sendExtension(int type, byte[] payload)- Since:
- 0.8.4
-
setMetaInfo
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
Deprecated.deadlocksAre 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
Deprecated.unusedSets 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 withresetCounters()
which is called every CHECK_PERIOD by PeerCheckerTask. -
getUploaded
public long getUploaded()Returns the number of bytes that have been uploaded. Can be reset to zero withresetCounters()
which is called every CHECK_PERIOD by PeerCheckerTask. -
resetCounters
public void resetCounters()Resets the downloaded and uploaded counters to zero. -
getInactiveTime
public long getInactiveTime() -
getMaxInactiveTime
public long getMaxInactiveTime()- Since:
- 0.9.36
-
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- Returns:
- number of completed pieces (not bytes)
-
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() -
getTotalCommentsSent
int getTotalCommentsSent()- Since:
- 0.9.31
-
setTotalCommentsSent
void setTotalCommentsSent(int count)- Since:
- 0.9.31
-
isWebPeer
public boolean isWebPeer()- Returns:
- false
- Since:
- 0.9.49
-