How mpetazzoni/ttorrent works
Purpose and entry points
Ttorrent is a Maven multi-module, pure-Java BitTorrent implementation usable as an embedded client, embedded tracker, or torrent-metainfo tool. Standalone CLI entry points are:
• cli/src/main/java/com/turn/ttorrent/cli/ClientMain.java
• cli/src/main/java/com/turn/ttorrent/cli/TrackerMain.java
• cli/src/main/java/com/turn/ttorrent/cli/TorrentMain.java
The main library APIs are SimpleClient for download/seeding and Tracker for serving announces.
Module boundaries
common owns protocol-neutral torrent metadata, peer identity/value types, and BitTorrent/tracker wire models. bencoding is the serialization substrate. network supplies reusable nonblocking channel management. ttorrent-client composes these into a peer client; ttorrent-tracker implements tracker state and HTTP request handling.
• common/src/main/java/com/turn/ttorrent/common/TorrentParser.java
• bencoding/src/main/java/com/turn/ttorrent/bcodec/BDecoder.java
• network/src/main/java/com/turn/ttorrent/network/ConnectionManager.java
Metainfo creation and parsing
Torrent creation reads source files, divides them into pieces, calculates hashes (single- or multi-threaded), builds metadata, and bencodes it. Parsing performs the inverse to expose immutable torrent metadata for clients and trackers.
• common/src/main/java/com/turn/ttorrent/common/TorrentCreator.java
• common/src/main/java/com/turn/ttorrent/common/creation/MetadataBuilder.java
• common/src/main/java/com/turn/ttorrent/common/TorrentSerializer.java
Client orchestration and lifecycle
SimpleClient is the embedding façade. It loads torrent metadata, creates/manages active torrents, dispatches lifecycle events, and coordinates tracker discovery, peer sessions, storage, and completion/seeding state.
• ttorrent-client/src/main/java/com/turn/ttorrent/client/SimpleClient.java
• ttorrent-client/src/main/java/com/turn/ttorrent/client/TorrentManagerImpl.java
• ttorrent-client/src/main/java/com/turn/ttorrent/client/SharedTorrent.java
Tracker discovery and peer protocol
The client announces torrent status to HTTP or UDP tracker endpoints, consumes peer lists, then opens peer connections. Peer sessions exchange BitTorrent handshakes and messages; connection admission and session-state listeners form a boundary between generic NIO transport and torrent semantics.
• ttorrent-client/src/main/java/com/turn/ttorrent/client/announce/TrackerClientFactoryImpl.java
• ttorrent-client/src/main/java/com/turn/ttorrent/client/network/HandshakeReceiver.java
• common/src/main/java/com/turn/ttorrent/common/protocol/PeerMessage.java
Piece transfer, selection, and disk persistence
Peer messages drive piece availability and requests. Request strategies choose interesting pieces and end-game behavior; received blocks are assembled, validated against torrent hashes, and persisted to single-file or multi-file storage. Storage is a client-local filesystem boundary.
• ttorrent-client/src/main/java/com/turn/ttorrent/client/strategy/RequestStrategy.java
• ttorrent-client/src/main/java/com/turn/ttorrent/client/Piece.java
• ttorrent-client/src/main/java/com/turn/ttorrent/client/storage/FileCollectionStorage.java
Tracker service
The tracker accepts announce requests, resolves each info hash to a tracked torrent, records peers, expires stale peers, and returns compact peer lists. It can optionally admit previously unknown torrents. The service is stateful in process; no persistent datastore is represented in this tree.
• ttorrent-tracker/src/main/java/com/turn/ttorrent/tracker/Tracker.java
• ttorrent-tracker/src/main/java/com/turn/ttorrent/tracker/TorrentsRepository.java
• ttorrent-tracker/src/main/java/com/turn/ttorrent/tracker/TrackerRequestProcessor.java
Runtime and external interfaces
Runtime is Java with Maven reactor modules. External interfaces are local filesystem reads/writes, TCP peer connections through Java NIO selectors, and tracker HTTP/UDP protocols. The client supports UDP tracker announces; tracker protocol message models cover HTTP and UDP, while tracker service implementation is centered on request processing.
• network/src/main/java/com/turn/ttorrent/network/ConnectionWorker.java
• common/src/main/java/com/turn/ttorrent/common/protocol/http/HTTPAnnounceRequestMessage.java
• common/src/main/java/com/turn/ttorrent/common/protocol/udp/UDPAnnounceRequestMessage.java
Main entry points: TrackerClientFactoryImpl.java Tracker discovery · HandshakeReceiver.java Peer sessions · SimpleClient.java SimpleClient · Piece.java Piece transfer
Components 20
CLI entry points
- Client CLI
cli/src/main/java/com/turn/ttorrent/cli/ClientMain.java - Tracker CLI
cli/src/main/java/com/turn/ttorrent/cli/TrackerMain.java - Torrent CLI
cli/src/main/java/com/turn/ttorrent/cli/TorrentMain.java
Shared modules
- Bencoding codec
bencoding/src/main/java/com/turn/ttorrent/bcodec/BDecoder.java - Torrent metadata · Immutable metainfo and protocol-neutral value types.
common/src/main/java/com/turn/ttorrent/common/TorrentParser.java - Metainfo creation · Builds piece hashes and torrent metadata from source files.
common/src/main/java/com/turn/ttorrent/common/creation/MetadataBuilder.java - Torrent serializer
common/src/main/java/com/turn/ttorrent/common/TorrentSerializer.java - Peer wire messages
common/src/main/java/com/turn/ttorrent/common/protocol/PeerMessage.java - Tracker wire messages · HTTP and UDP announce models.
common/src/main/java/com/turn/ttorrent/common/protocol/http/HTTPAnnounceRequestMessage.java - NIO transport · Reusable nonblocking channel management.
network/src/main/java/com/turn/ttorrent/network/ConnectionManager.java
Peer client
- SimpleClient · Coordinates torrent lifecycle, sessions, discovery, and seeding.
ttorrent-client/src/main/java/com/turn/ttorrent/client/SimpleClient.java - Torrent manager
ttorrent-client/src/main/java/com/turn/ttorrent/client/TorrentManagerImpl.java - Active torrent · Tracks transfer, completion, and seeding state.
ttorrent-client/src/main/java/com/turn/ttorrent/client/SharedTorrent.java - Tracker discovery · Announces over HTTP or UDP and consumes peers.
ttorrent-client/src/main/java/com/turn/ttorrent/client/announce/TrackerClientFactoryImpl.java - Peer sessions · Handles handshake admission and BitTorrent message exchange.
ttorrent-client/src/main/java/com/turn/ttorrent/client/network/HandshakeReceiver.java - Piece transfer · Selects, assembles, and hash-validates received blocks.
ttorrent-client/src/main/java/com/turn/ttorrent/client/Piece.java - File storage · Persists single-file and multi-file torrent content.
ttorrent-client/src/main/java/com/turn/ttorrent/client/storage/FileCollectionStorage.java
Tracker service
- Tracker · Serves announces and optionally admits unknown torrents.
ttorrent-tracker/src/main/java/com/turn/ttorrent/tracker/Tracker.java - Announce processor · Records announcing peers and returns compact peer lists.
ttorrent-tracker/src/main/java/com/turn/ttorrent/tracker/TrackerRequestProcessor.java - Tracked torrents · Maps info hashes to peer populations and expires stale peers.
ttorrent-tracker/src/main/java/com/turn/ttorrent/tracker/TorrentsRepository.java
Connections 21
- Client CLI → SimpleClient: runs
- Tracker CLI → Tracker: runs
- Torrent CLI → Metainfo creation: creates
- Metainfo creation → Torrent serializer: builds metainfo
- Torrent serializer → Bencoding codec: bencoded format
- Bencoding codec → Torrent metadata: parses into
- SimpleClient → Torrent manager: manages
- Torrent manager → Active torrent: owns active
- SimpleClient → Torrent metadata: loads
- Active torrent → Tracker discovery: announces status
- Tracker discovery → Tracker wire messages: uses HTTP/UDP
- Tracker discovery → Tracker: announce protocol
- Tracker discovery → Peer sessions: supplies peers
- Peer sessions → NIO transport: uses channels
- Peer sessions → Peer wire messages: exchanges
- Peer sessions → Piece transfer: drives requests
- Piece transfer → Active torrent: validates hashes
- Piece transfer → File storage: persists blocks
- Tracker → Announce processor: routes announces
- Announce processor → Tracker wire messages: parses and responds
- Announce processor → Tracked torrents: updates peers