实例介绍
Bt是一个完整的Java 8 BitTorrent实现,支持peer exchange、磁力链接、DHT、加密等多种功能。该项目遵循BitTorrent协议规范,支持多项BEPs和扩展,提供丰富的资源、示例代码和使用说明。Bt具有灵活性、自定义后端、协议扩展、并行下载、部分下载等特点,同时提供Java 8 CompletableFuture支持。
【实例截图】
文件清单
└── bt-62181084567c411ba9351abc88b3a017dae380cd
├── appveyor.yml
├── bt-bencoding
│ ├── pom.xml
│ └── src
│ ├── main
│ │ └── java
│ │ └── bt
│ │ └── bencoding
│ │ ├── BEType.java
│ │ ├── model
│ │ │ ├── BaseBEObjectModel.java
│ │ │ ├── BEIntegerModel.java
│ │ │ ├── BEListModel.java
│ │ │ ├── BEMapModel.java
│ │ │ ├── BEObject.java
│ │ │ ├── BEObjectModelBuilderFactory.java
│ │ │ ├── BEObjectModelBuilder.java
│ │ │ ├── BEObjectModel.java
│ │ │ ├── BEObjectModelLoader.java
│ │ │ ├── BEStringModel.java
│ │ │ ├── ClassUtil.java
│ │ │ ├── DefaultModelBuilderFactory.java
│ │ │ ├── JUMModelBuilder.java
│ │ │ ├── rule
│ │ │ │ ├── ExclusiveRule.java
│ │ │ │ ├── RequiredRule.java
│ │ │ │ └── Rule.java
│ │ │ ├── TypesMapping.java
│ │ │ ├── ValidationResult.java
│ │ │ └── YamlBEObjectModelLoader.java
│ │ ├── serializers
│ │ │ ├── BEEncoder.java
│ │ │ ├── BEIntegerDecoder.java
│ │ │ ├── BEListDecoder.java
│ │ │ ├── BEMapDecoder.java
│ │ │ ├── BEObjectDecoder.java
│ │ │ ├── BEParser.java
│ │ │ ├── BEPrefixedTypeDecoder.java
│ │ │ ├── BEStringDecoder.java
│ │ │ ├── BtParseException.java
│ │ │ └── Scanner.java
│ │ └── types
│ │ ├── BEInteger.java
│ │ ├── BEList.java
│ │ ├── BEMap.java
│ │ └── BEString.java
│ └── test
│ ├── java
│ │ └── bt
│ │ └── bencoding
│ │ ├── BEEncoderTest.java
│ │ ├── BEParserTest.java
│ │ └── model
│ │ └── YamlBEObjectModelLoaderTest.java
│ └── resources
│ └── bt
│ └── bencoding
│ └── model
│ ├── metainfo_correct.yml
│ ├── metainfo_missing_model.yml
│ ├── single_file_correct.torrent
│ ├── single_file_exclusive_properties.torrent
│ ├── single_file_invalid_type.torrent
│ └── single_file_missing_property.torrent
├── bt-cli
│ ├── pom.xml
│ ├── README.md
│ └── src
│ └── main
│ ├── java
│ │ └── bt
│ │ └── cli
│ │ ├── CliClient.java
│ │ ├── CliFileSelector.java
│ │ ├── KeyStrokeBinding.java
│ │ ├── Options.java
│ │ └── SessionStatePrinter.java
│ └── resources
│ └── log4j2.xml
├── bt-core
│ ├── pom.xml
│ └── src
│ └── main
│ ├── java
│ │ └── bt
│ │ ├── BaseClientBuilder.java
│ │ ├── BtClientBuilder.java
│ │ ├── BtException.java
│ │ ├── Bt.java
│ │ ├── BufferingMap.java
│ │ ├── CountingThreadFactory.java
│ │ ├── data
│ │ │ ├── Bitfield.java
│ │ │ ├── BlockSet.java
│ │ │ ├── ChunkDescriptor.java
│ │ │ ├── ChunkVerifier.java
│ │ │ ├── CompletableTorrentFile.java
│ │ │ ├── DataDescriptorFactory.java
│ │ │ ├── DataDescriptor.java
│ │ │ ├── DataRange.java
│ │ │ ├── DataRangeVisitor.java
│ │ │ ├── DataReaderChannel.java
│ │ │ ├── DataReaderFactory.java
│ │ │ ├── DataReader.java
│ │ │ ├── DefaultChunkDescriptor.java
│ │ │ ├── DefaultChunkVerifier.java
│ │ │ ├── DefaultDataDescriptor.java
│ │ │ ├── digest
│ │ │ │ ├── Digester.java
│ │ │ │ ├── JavaSecurityDigester.java
│ │ │ │ ├── SHA1Digester.java
│ │ │ │ └── SoftThreadLocal.java
│ │ │ ├── file
│ │ │ │ ├── CachedOpenFile.java
│ │ │ │ ├── FileCacheKey.java
│ │ │ │ ├── FileSystemStorage.java
│ │ │ │ ├── FileSystemStorageUnit.java
│ │ │ │ ├── OpenFileCache.java
│ │ │ │ └── PathNormalizer.java
│ │ │ ├── IDataDescriptorFactory.java
│ │ │ ├── LocalBitfield.java
│ │ │ ├── PeerBitfield.java
│ │ │ ├── PieceUtils.java
│ │ │ ├── range
│ │ │ │ ├── BlockRange.java
│ │ │ │ ├── ByteRange.java
│ │ │ │ ├── DelegatingDataRange.java
│ │ │ │ ├── DelegatingRange.java
│ │ │ │ ├── MutableBlockSet.java
│ │ │ │ ├── Range.java
│ │ │ │ ├── Ranges.java
│ │ │ │ ├── SynchronizedBlockSet.java
│ │ │ │ ├── SynchronizedDataRange.java
│ │ │ │ └── SynchronizedRange.java
│ │ │ ├── ReadWriteDataRange.java
│ │ │ ├── Storage.java
│ │ │ └── StorageUnit.java
│ │ ├── DefaultClient.java
│ │ ├── event
│ │ │ ├── BaseEvent.java
│ │ │ ├── EventBus.java
│ │ │ ├── Event.java
│ │ │ ├── EventSink.java
│ │ │ ├── EventSource.java
│ │ │ ├── MetadataAvailableEvent.java
│ │ │ ├── PeerBitfieldUpdatedEvent.java
│ │ │ ├── PeerConnectedEvent.java
│ │ │ ├── PeerDisconnectedEvent.java
│ │ │ ├── PeerDiscoveredEvent.java
│ │ │ ├── PieceVerifiedEvent.java
│ │ │ ├── TorrentEvent.java
│ │ │ ├── TorrentStartedEvent.java
│ │ │ └── TorrentStoppedEvent.java
│ │ ├── LazyClient.java
│ │ ├── magnet
│ │ │ ├── MagnetUri.java
│ │ │ ├── MagnetUriParser.java
│ │ │ ├── UtMetadata.java
│ │ │ └── UtMetadataMessageHandler.java
│ │ ├── metainfo
│ │ │ ├── DefaultTorrentFile.java
│ │ │ ├── DefaultTorrent.java
│ │ │ ├── IMetadataService.java
│ │ │ ├── MetadataConstants.java
│ │ │ ├── MetadataService.java
│ │ │ ├── TorrentFile.java
│ │ │ ├── TorrentId.java
│ │ │ ├── Torrent.java
│ │ │ └── TorrentSource.java
│ │ ├── module
│ │ │ ├── BitTorrentProtocol.java
│ │ │ ├── BtModuleProvider.java
│ │ │ ├── ClientExecutor.java
│ │ │ ├── Contribute.java
│ │ │ ├── ExtendedMessageHandlers.java
│ │ │ ├── MessageHandlers.java
│ │ │ ├── MessagingAgents.java
│ │ │ ├── PeerConnectionSelector.java
│ │ │ ├── ProtocolModuleExtender.java
│ │ │ ├── ProtocolModule.java
│ │ │ ├── ServiceModuleExtender.java
│ │ │ ├── ServiceModule.java
│ │ │ └── TrackerFactories.java
│ │ ├── net
│ │ │ ├── BigIntegers.java
│ │ │ ├── BitfieldConnectionHandler.java
│ │ │ ├── buffer
│ │ │ │ ├── BorrowedBuffer.java
│ │ │ │ ├── BufferedData.java
│ │ │ │ ├── BufferManager.java
│ │ │ │ ├── BufferMutator.java
│ │ │ │ ├── Buffers.java
│ │ │ │ ├── ByteBufferView.java
│ │ │ │ ├── DelegatingByteBufferView.java
│ │ │ │ ├── IBufferManager.java
│ │ │ │ └── SplicedByteBufferView.java
│ │ │ ├── ByteChannelReader.java
│ │ │ ├── ConnectionHandlerFactory.java
│ │ │ ├── ConnectionHandler.java
│ │ │ ├── ConnectionKey.java
│ │ │ ├── ConnectionResult.java
│ │ │ ├── ConnectionRoutine.java
│ │ │ ├── ConnectionSource.java
│ │ │ ├── crypto
│ │ │ │ ├── CipherBufferMutator.java
│ │ │ │ ├── EncryptedChannel.java
│ │ │ │ ├── MSEHandshakeProcessor.java
│ │ │ │ └── MSEKeyPairGenerator.java
│ │ │ ├── DataReceiver.java
│ │ │ ├── DataReceivingLoop.java
│ │ │ ├── extended
│ │ │ │ ├── ExtendedHandshakeConsumer.java
│ │ │ │ └── ExtendedProtocolHandshakeHandler.java
│ │ │ ├── HandshakeHandler.java
│ │ │ ├── IConnectionHandlerFactory.java
│ │ │ ├── IConnectionSource.java
│ │ │ ├── IMessageDispatcher.java
│ │ │ ├── IncomingConnectionListener.java
│ │ │ ├── IncomingHandshakeHandler.java
│ │ │ ├── InetPeerAddress.java
│ │ │ ├── InetPeer.java
│ │ │ ├── InternetProtocolUtils.java
│ │ │ ├── IPeerConnectionFactory.java
│ │ │ ├── IPeerConnectionPool.java
│ │ │ ├── MessageDispatcher.java
│ │ │ ├── OutgoingHandshakeHandler.java
│ │ │ ├── PeerConnectionAcceptor.java
│ │ │ ├── PeerConnectionFactory.java
│ │ │ ├── PeerConnection.java
│ │ │ ├── PeerConnectionPool.java
│ │ │ ├── PeerId.java
│ │ │ ├── Peer.java
│ │ │ ├── pipeline
│ │ │ │ ├── BufferedPieceRegistry.java
│ │ │ │ ├── ChannelHandlerContext.java
│ │ │ │ ├── ChannelHandler.java
│ │ │ │ ├── ChannelPipelineBuilder.java
│ │ │ │ ├── ChannelPipelineFactory.java
│ │ │ │ ├── ChannelPipeline.java
│ │ │ │ ├── DefaultChannelPipeline.java
│ │ │ │ ├── IBufferedPieceRegistry.java
│ │ │ │ ├── IChannelPipelineFactory.java
│ │ │ │ ├── InboundMessageProcessor.java
│ │ │ │ ├── MessageDeserializer.java
│ │ │ │ ├── MessageSerializer.java
│ │ │ │ └── SocketChannelHandler.java
│ │ │ ├── portmapping
│ │ │ │ ├── impl
│ │ │ │ │ ├── NoOpPortMapper.java
│ │ │ │ │ ├── PortMappingInitializer.java
│ │ │ │ │ └── PortMappingModule.java
│ │ │ │ ├── PortMapper.java
│ │ │ │ └── PortMapProtocol.java
│ │ │ ├── SharedSelector.java
│ │ │ ├── SocketChannelConnectionAcceptor.java
│ │ │ ├── SocketPeerConnection.java
│ │ │ └── WriteOnlyPeerConnection.java
│ │ ├── peer
│ │ │ ├── IPeerRegistry.java
│ │ │ ├── lan
│ │ │ │ ├── AnnounceGroupChannel.java
│ │ │ │ ├── AnnounceGroup.java
│ │ │ │ ├── AnnounceMessage.java
│ │ │ │ ├── Cookie.java
│ │ │ │ ├── ILocalServiceDiscoveryInfo.java
│ │ │ │ ├── ILocalServiceDiscoveryService.java
│ │ │ │ ├── LocalServiceDiscoveryAnnouncer.java
│ │ │ │ ├── LocalServiceDiscoveryConfig.java
│ │ │ │ ├── LocalServiceDiscoveryInfo.java
│ │ │ │ ├── LocalServiceDiscoveryModule.java
│ │ │ │ ├── LocalServiceDiscoveryPeerSourceFactory.java
│ │ │ │ └── LocalServiceDiscoveryService.java
│ │ │ ├── PeerOptions.java
│ │ │ ├── PeerRegistry.java
│ │ │ ├── PeerSourceFactory.java
│ │ │ ├── PeerSource.java
│ │ │ ├── ScheduledPeerSource.java
│ │ │ ├── TrackerPeerSourceFactory.java
│ │ │ └── TrackerPeerSource.java
│ │ ├── peerexchange
│ │ │ ├── PeerEvent.java
│ │ │ ├── PeerExchangeConfig.java
│ │ │ ├── PeerExchange.java
│ │ │ ├── PeerExchangeMessageHandler.java
│ │ │ ├── PeerExchangeModule.java
│ │ │ ├── PeerExchangePeerSourceFactory.java
│ │ │ └── PeerExchangePeerSource.java
│ │ ├── processor
│ │ │ ├── ChainProcessor.java
│ │ │ ├── ContextFinalizer.java
│ │ │ ├── listener
│ │ │ │ ├── ListenerSource.java
│ │ │ │ └── ProcessingEvent.java
│ │ │ ├── magnet
│ │ │ │ ├── FetchMetadataStage.java
│ │ │ │ ├── InitializeMagnetTorrentProcessingStage.java
│ │ │ │ ├── MagnetContext.java
│ │ │ │ └── ProcessMagnetTorrentStage.java
│ │ │ ├── ProcessingContext.java
│ │ │ ├── ProcessingStage.java
│ │ │ ├── ProcessorFactory.java
│ │ │ ├── Processor.java
│ │ │ ├── RoutingProcessingStage.java
│ │ │ ├── TerminateOnErrorProcessingStage.java
│ │ │ ├── torrent
│ │ │ │ ├── ChooseFilesStage.java
│ │ │ │ ├── CreateSessionStage.java
│ │ │ │ ├── FetchTorrentStage.java
│ │ │ │ ├── FilePiecePriorityMapper.java
│ │ │ │ ├── InitializeTorrentProcessingStage.java
│ │ │ │ ├── ProcessTorrentStage.java
│ │ │ │ ├── SeedStage.java
│ │ │ │ ├── TorrentContextFinalizer.java
│ │ │ │ └── TorrentContext.java
│ │ │ └── TorrentProcessorFactory.java
│ │ ├── protocol
│ │ │ ├── Bitfield.java
│ │ │ ├── BitOrder.java
│ │ │ ├── Cancel.java
│ │ │ ├── Choke.java
│ │ │ ├── crypto
│ │ │ │ ├── EncryptionPolicy.java
│ │ │ │ └── MSECipher.java
│ │ │ ├── DecodingContext.java
│ │ │ ├── EncodingContext.java
│ │ │ ├── extended
│ │ │ │ ├── AlphaSortedMapping.java
│ │ │ │ ├── ExtendedHandshakeFactory.java
│ │ │ │ ├── ExtendedHandshake.java
│ │ │ │ ├── ExtendedHandshakeMessageHandler.java
│ │ │ │ ├── ExtendedMessage.java
│ │ │ │ ├── ExtendedMessageTypeMapping.java
│ │ │ │ └── ExtendedProtocol.java
│ │ │ ├── handler
│ │ │ │ ├── BaseMessageHandler.java
│ │ │ │ ├── BitfieldHandler.java
│ │ │ │ ├── CancelHandler.java
│ │ │ │ ├── ChokeHandler.java
│ │ │ │ ├── HaveHandler.java
│ │ │ │ ├── InterestedHandler.java
│ │ │ │ ├── MessageHandler.java
│ │ │ │ ├── NotInterestedHandler.java
│ │ │ │ ├── PieceHandler.java
│ │ │ │ ├── RequestHandler.java
│ │ │ │ ├── UnchokeHandler.java
│ │ │ │ └── UniqueMessageHandler.java
│ │ │ ├── HandshakeFactory.java
│ │ │ ├── Handshake.java
│ │ │ ├── Have.java
│ │ │ ├── IExtendedHandshakeFactory.java
│ │ │ ├── IHandshakeFactory.java
│ │ │ ├── Interested.java
│ │ │ ├── InvalidMessageException.java
│ │ │ ├── KeepAlive.java
│ │ │ ├── Message.java
│ │ │ ├── NotInterested.java
│ │ │ ├── Piece.java
│ │ │ ├── Protocol.java
│ │ │ ├── Protocols.java
│ │ │ ├── Request.java
│ │ │ ├── StandardBittorrentProtocol.java
│ │ │ └── Unchoke.java
│ │ ├── runtime
│ │ │ ├── BtClient.java
│ │ │ ├── BtRuntimeBuilder.java
│ │ │ ├── BtRuntime.java
│ │ │ └── Config.java
│ │ ├── service
│ │ │ ├── ApplicationService.java
│ │ │ ├── ClasspathApplicationService.java
│ │ │ ├── CryptoUtil.java
│ │ │ ├── ExecutorServiceProvider.java
│ │ │ ├── IdentityService.java
│ │ │ ├── IRuntimeLifecycleBinder.java
│ │ │ ├── LifecycleBinding.java
│ │ │ ├── NetworkUtil.java
│ │ │ ├── RuntimeLifecycleBinder.java
│ │ │ ├── VersionAwareIdentityService.java
│ │ │ └── Version.java
│ │ ├── StandaloneClientBuilder.java
│ │ ├── torrent
│ │ │ ├── AdhocTorrentRegistry.java
│ │ │ ├── annotation
│ │ │ │ ├── Consumes.java
│ │ │ │ └── Produces.java
│ │ │ ├── BitfieldBasedStatistics.java
│ │ │ ├── callbacks
│ │ │ │ └── FileDownloadCompleteCallback.java
│ │ │ ├── compiler
│ │ │ │ ├── CompilerVisitor.java
│ │ │ │ ├── ConsumerInfo.java
│ │ │ │ ├── MessagingAgentCompiler.java
│ │ │ │ └── ProducerInfo.java
│ │ │ ├── data
│ │ │ │ ├── BlockCache.java
│ │ │ │ ├── BlockReader.java
│ │ │ │ ├── BlockRead.java
│ │ │ │ ├── BlockWrite.java
│ │ │ │ ├── DataWorker.java
│ │ │ │ ├── DefaultDataWorker.java
│ │ │ │ ├── LRUBlockCache.java
│ │ │ │ └── NoCache.java
│ │ │ ├── DefaultTorrentDescriptor.java
│ │ │ ├── DefaultTorrentSessionState.java
│ │ │ ├── fileselector
│ │ │ │ ├── FilePriority.java
│ │ │ │ ├── FilePrioritySelector.java
│ │ │ │ ├── FilePrioritySkipSelector.java
│ │ │ │ ├── SelectionResult.java
│ │ │ │ ├── TorrentFileSelector.java
│ │ │ │ └── UpdatedFilePriority.java
│ │ │ ├── maker
│ │ │ │ ├── TorrentBuilder.java
│ │ │ │ └── TorrentMaker.java
│ │ │ ├── messaging
│ │ │ │ ├── Assignment.java
│ │ │ │ ├── Assignments.java
│ │ │ │ ├── BitfieldCollectingConsumer.java
│ │ │ │ ├── BitfieldConsumer.java
│ │ │ │ ├── Choker.java
│ │ │ │ ├── ConnectionState.java
│ │ │ │ ├── DefaultMessageRouter.java
│ │ │ │ ├── ExchangedMetadata.java
│ │ │ │ ├── GenericConsumer.java
│ │ │ │ ├── IPeerWorkerFactory.java
│ │ │ │ ├── Mapper.java
│ │ │ │ ├── MessageConsumer.java
│ │ │ │ ├── MessageContext.java
│ │ │ │ ├── MessageProducer.java
│ │ │ │ ├── MessageRouter.java
│ │ │ │ ├── MetadataConsumer.java
│ │ │ │ ├── MetadataProducer.java
│ │ │ │ ├── PeerRequestConsumer.java
│ │ │ │ ├── PeerWorkerFactory.java
│ │ │ │ ├── PeerWorker.java
│ │ │ │ ├── PieceConsumer.java
│ │ │ │ ├── RequestProducer.java
│ │ │ │ ├── RoutingPeerWorker.java
│ │ │ │ └── TorrentWorker.java
│ │ │ ├── PieceStatistics.java
│ │ │ ├── selector
│ │ │ │ ├── IncompletePiecesValidator.java
│ │ │ │ ├── PackedIntComparator.java
│ │ │ │ ├── PieceSelector.java
│ │ │ │ ├── PrioritizedPieceSelector.java
│ │ │ │ ├── RandomizedRarestFirstSelector.java
│ │ │ │ ├── RarestFirstSelector.java
│ │ │ │ ├── SequentialSelector.java
│ │ │ │ ├── ShuffleUtils.java
│ │ │ │ └── ValidatingSelector.java
│ │ │ ├── TorrentDescriptor.java
│ │ │ ├── TorrentRegistry.java
│ │ │ ├── TorrentSessionState.java
│ │ │ └── TrackerAnnouncer.java
│ │ ├── TorrentClientBuilder.java
│ │ └── tracker
│ │ ├── AnnounceKey.java
│ │ ├── CompactPeerInfo.java
│ │ ├── ITrackerService.java
│ │ ├── MultiTracker.java
│ │ ├── SecretKey.java
│ │ ├── TrackerFactory.java
│ │ ├── Tracker.java
│ │ ├── TrackerRequestBuilder.java
│ │ ├── TrackerResponse.java
│ │ ├── TrackerService.java
│ │ └── udp
│ │ ├── AnnounceRequest.java
│ │ ├── AnnounceResponseHandler.java
│ │ ├── ConnectRequest.java
│ │ ├── ConnectResponseHandler.java
│ │ ├── Session.java
│ │ ├── UdpMessageWorker.java
│ │ ├── UdpTrackerFactory.java
│ │ ├── UdpTracker.java
│ │ ├── UdpTrackerMessage.java
│ │ └── UdpTrackerResponseHandler.java
│ └── resources
│ ├── infodict.yml
│ ├── metainfo.yml
│ └── tracker_response.yml
├── bt-dht
│ ├── bt-dht
│ │ ├── pom.xml
│ │ └── src
│ │ ├── main
│ │ │ ├── java
│ │ │ │ └── bt
│ │ │ │ ├── dht
│ │ │ │ │ ├── DHTConfig.java
│ │ │ │ │ ├── DHTHandshakeHandler.java
│ │ │ │ │ ├── DHTModule.java
│ │ │ │ │ ├── DHTModuleProvider.java
│ │ │ │ │ ├── DHTPeerSourceFactory.java
│ │ │ │ │ ├── DHTPeerSource.java
│ │ │ │ │ ├── DHTService.java
│ │ │ │ │ ├── MldhtService.java
│ │ │ │ │ └── stream
│ │ │ │ │ └── StreamAdapter.java
│ │ │ │ └── protocol
│ │ │ │ ├── handler
│ │ │ │ │ └── PortMessageHandler.java
│ │ │ │ └── Port.java
│ │ │ └── resources
│ │ │ └── META-INF
│ │ │ └── services
│ │ │ └── bt.module.BtModuleProvider
│ │ └── test
│ │ └── java
│ │ └── bt
│ │ ├── dht
│ │ │ └── stream
│ │ │ └── StreamAdapterTest.java
│ │ └── protocol
│ │ ├── PortMatcher.java
│ │ └── PortMessageHandlerTest.java
│ ├── patch
│ │ └── allow-bogon-addresses-in-private-dht.patch
│ ├── pom.xml
│ ├── README.md
│ └── the8472
│ └── mldht
│ ├── bin
│ │ ├── mldht-daemon
│ │ └── mldht-remote-cli
│ ├── docs
│ │ ├── keyspace-traversal.md
│ │ ├── relicense.mbox
│ │ ├── sanitizing-algorithms.rst
│ │ └── use-as-library.md
│ ├── feeds
│ ├── gpl-2.0.txt
│ ├── LICENSE
│ ├── pom.xml
│ ├── README.md
│ ├── src
│ │ ├── lbms
│ │ │ └── plugins
│ │ │ └── mldht
│ │ │ ├── DHTConfiguration.java
│ │ │ ├── indexer
│ │ │ │ └── utils
│ │ │ │ ├── GenericBloomFilter.java
│ │ │ │ └── RotatingBloomFilter.java
│ │ │ ├── kad
│ │ │ │ ├── AnnounceNodeCache.java
│ │ │ │ ├── BloomFilterBEP33.java
│ │ │ │ ├── Database.java
│ │ │ │ ├── DatabaseStats.java
│ │ │ │ ├── DBItem.java
│ │ │ │ ├── DHTBase.java
│ │ │ │ ├── DHTConstants.java
│ │ │ │ ├── DHTException.java
│ │ │ │ ├── DHTIndexingListener.java
│ │ │ │ ├── DHT.java
│ │ │ │ ├── DHTLogger.java
│ │ │ │ ├── DHTStats.java
│ │ │ │ ├── DHTStatsListener.java
│ │ │ │ ├── DHTStatus.java
│ │ │ │ ├── DHTStatusListener.java
│ │ │ │ ├── GenericStorage.java
│ │ │ │ ├── IDMismatchDetector.java
│ │ │ │ ├── KBucketEntry.java
│ │ │ │ ├── KBucket.java
│ │ │ │ ├── KClosestNodesSearch.java
│ │ │ │ ├── Key.java
│ │ │ │ ├── messages
│ │ │ │ │ ├── AbstractLookupRequest.java
│ │ │ │ │ ├── AbstractLookupResponse.java
│ │ │ │ │ ├── AnnounceRequest.java
│ │ │ │ │ ├── AnnounceResponse.java
│ │ │ │ │ ├── ErrorMessage.java
│ │ │ │ │ ├── FindNodeRequest.java
│ │ │ │ │ ├── FindNodeResponse.java
│ │ │ │ │ ├── GetPeersRequest.java
│ │ │ │ │ ├── GetPeersResponse.java
│ │ │ │ │ ├── GetRequest.java
│ │ │ │ │ ├── GetResponse.java
│ │ │ │ │ ├── MessageBase.java
│ │ │ │ │ ├── MessageDecoder.java
│ │ │ │ │ ├── MessageException.java
│ │ │ │ │ ├── PingRequest.java
│ │ │ │ │ ├── PingResponse.java
│ │ │ │ │ ├── PutRequest.java
│ │ │ │ │ ├── PutResponse.java
│ │ │ │ │ ├── SampleRequest.java
│ │ │ │ │ ├── SampleResponse.java
│ │ │ │ │ ├── UnknownTypeRequest.java
│ │ │ │ │ └── UnknownTypeResponse.java
│ │ │ │ ├── Node.java
│ │ │ │ ├── NodeList.java
│ │ │ │ ├── NonReachableCache.java
│ │ │ │ ├── PeerAddressDBItem.java
│ │ │ │ ├── Prefix.java
│ │ │ │ ├── RPCCall.java
│ │ │ │ ├── RPCCallListener.java
│ │ │ │ ├── RPCServer.java
│ │ │ │ ├── RPCServerManager.java
│ │ │ │ ├── RPCState.java
│ │ │ │ ├── RPCStats.java
│ │ │ │ ├── ScrapeResponseHandler.java
│ │ │ │ ├── SpamThrottle.java
│ │ │ │ ├── TaskBuilder.java
│ │ │ │ ├── tasks
│ │ │ │ │ ├── AnnounceTask.java
│ │ │ │ │ ├── ClosestSet.java
│ │ │ │ │ ├── CountedStat.java
│ │ │ │ │ ├── GetLookupTask.java
│ │ │ │ │ ├── IteratingTask.java
│ │ │ │ │ ├── IterativeLookupCandidates.java
│ │ │ │ │ ├── KeyspaceCrawler.java
│ │ │ │ │ ├── KeyspaceSampler.java
│ │ │ │ │ ├── NodeLookup.java
│ │ │ │ │ ├── PeerLookupTask.java
│ │ │ │ │ ├── PingRefreshTask.java
│ │ │ │ │ ├── PutTask.java
│ │ │ │ │ ├── RequestCandidateEvaluator.java
│ │ │ │ │ ├── TargetedTask.java
│ │ │ │ │ ├── Task.java
│ │ │ │ │ ├── TaskListener.java
│ │ │ │ │ ├── TaskManager.java
│ │ │ │ │ └── TaskStats.java
│ │ │ │ └── utils
│ │ │ │ ├── AddressUtils.java
│ │ │ │ ├── BitVector.java
│ │ │ │ ├── ByteWrapper.java
│ │ │ │ ├── PackUtil.java
│ │ │ │ ├── PopulationEstimator.java
│ │ │ │ ├── PopulationListener.java
│ │ │ │ ├── ResponseTimeoutFilter.java
│ │ │ │ └── ThreadLocalUtils.java
│ │ │ └── utils
│ │ │ ├── Blackhole.java
│ │ │ ├── ExponentialWeightendMovingAverage.java
│ │ │ ├── NIOConnectionManager.java
│ │ │ ├── Radixable.java
│ │ │ ├── RadixSort.java
│ │ │ └── Selectable.java
│ │ └── the8472
│ │ ├── bencode
│ │ │ ├── BDecoder.java
│ │ │ ├── BEncoder.java
│ │ │ ├── PathMatcher.java
│ │ │ ├── PrettyPrinter.java
│ │ │ ├── Tokenizer.java
│ │ │ └── Utils.java
│ │ ├── bt
│ │ │ ├── MetadataPool.java
│ │ │ ├── PullMetaDataConnection.java
│ │ │ ├── TorrentUtils.java
│ │ │ └── UselessPeerFilter.java
│ │ ├── mldht
│ │ │ ├── cli
│ │ │ │ ├── Client.java
│ │ │ │ ├── CommandProcessor.java
│ │ │ │ ├── commands
│ │ │ │ │ ├── Burst.java
│ │ │ │ │ ├── Get.java
│ │ │ │ │ ├── GetPeers.java
│ │ │ │ │ ├── GetTorrent.java
│ │ │ │ │ ├── Help.java
│ │ │ │ │ ├── Ping.java
│ │ │ │ │ ├── Put.java
│ │ │ │ │ └── Sampling.java
│ │ │ │ ├── ParseArgs.java
│ │ │ │ ├── Server.java
│ │ │ │ └── TorrentInfo.java
│ │ │ ├── Component.java
│ │ │ ├── config-defaults.xml
│ │ │ ├── config.xsd
│ │ │ ├── Diagnostics.java
│ │ │ ├── Firehose.java
│ │ │ ├── indexing
│ │ │ │ ├── ActiveLookupProvider.java
│ │ │ │ ├── OpentrackerLiveSync.java
│ │ │ │ └── TorrentDumper.java
│ │ │ ├── Launcher.java
│ │ │ ├── PassiveRedisIndexer.java
│ │ │ └── TorrentFetcher.java
│ │ └── utils
│ │ ├── AnonAllocator.java
│ │ ├── Arrays.java
│ │ ├── concurrent
│ │ │ ├── LoggingScheduledThreadPoolExecutor.java
│ │ │ ├── NonblockingScheduledExecutor.java
│ │ │ └── SerializedTaskExecutor.java
│ │ ├── ConfigReader.java
│ │ ├── CowSet.java
│ │ ├── FilesystemNotifications.java
│ │ ├── Functional.java
│ │ ├── io
│ │ │ ├── ConnectionAcceptor.java
│ │ │ ├── FileIO.java
│ │ │ └── NetMask.java
│ │ ├── MathUtils.java
│ │ ├── Pair.java
│ │ ├── ShufflingBag.java
│ │ ├── SortedCoWSet.java
│ │ └── XMLUtils.java
│ └── test
│ ├── lbms
│ │ └── plugins
│ │ └── mldht
│ │ ├── indexer
│ │ │ └── utils
│ │ │ └── RotatingBloomFilterTest.java
│ │ └── kad
│ │ ├── DHTLifeCycleTest.java
│ │ ├── KClosestNodeSearchTest.java
│ │ ├── NodeFactory.java
│ │ ├── NodeTest.java
│ │ ├── OnInsertValidations.java
│ │ ├── RoutingTableTest.java
│ │ └── utils
│ │ ├── AddressUtilsTest.java
│ │ └── TimeoutFilterStatsTest.java
│ └── the8472
│ ├── test
│ │ ├── bencode
│ │ │ ├── DecoderTest.java
│ │ │ ├── EncoderTest.java
│ │ │ ├── KeyTest.java
│ │ │ ├── PathMatcherTest.java
│ │ │ ├── PrefixTest.java
│ │ │ └── TokenizerTest.java
│ │ ├── Bep33.java
│ │ ├── Bep42.java
│ │ └── Bep44.java
│ └── utils
│ ├── ArraysTest.java
│ ├── io
│ │ └── NetMaskTest.java
│ └── NeverRunsExecutor.java
├── bt-http-tracker-client
│ ├── pom.xml
│ └── src
│ ├── main
│ │ ├── java
│ │ │ └── bt
│ │ │ └── tracker
│ │ │ └── http
│ │ │ ├── CommonsHttpResponseHandler.java
│ │ │ ├── HttpResponseHandler.java
│ │ │ ├── HttpTrackerFactory.java
│ │ │ ├── HttpTracker.java
│ │ │ ├── HttpTrackerModule.java
│ │ │ ├── HttpTrackerModuleProvider.java
│ │ │ └── urlencoding
│ │ │ ├── BinaryQueryNamedValue.java
│ │ │ ├── QueryBuilderUtil.java
│ │ │ └── TrackerQueryBuilder.java
│ │ └── resources
│ │ └── META-INF
│ │ └── services
│ │ └── bt.module.BtModuleProvider
│ └── test
│ ├── java
│ │ └── bt
│ │ └── tracker
│ │ └── http
│ │ └── HttpResponseHandlerTest.java
│ └── resources
│ └── bt
│ └── tracker
│ └── http
│ ├── tracker_response_failure1
│ └── tracker_response_success1
├── bt-tests
│ ├── pom.xml
│ └── src
│ ├── main
│ │ ├── java
│ │ │ └── bt
│ │ │ ├── it
│ │ │ │ └── fixture
│ │ │ │ ├── BaseBtTest.java
│ │ │ │ ├── BtRuntimeFactory.java
│ │ │ │ ├── DefaultSwarmPeerFactory.java
│ │ │ │ ├── LeecherPeer.java
│ │ │ │ ├── SeederPeer.java
│ │ │ │ ├── SharedTrackerModule.java
│ │ │ │ ├── SwarmBuilder.java
│ │ │ │ ├── Swarm.java
│ │ │ │ ├── SwarmPeerFactory.java
│ │ │ │ ├── SwarmPeer.java
│ │ │ │ ├── TestExecutorModule.java
│ │ │ │ ├── TestExecutorServiceProvider.java
│ │ │ │ └── TorrentFiles.java
│ │ │ └── test
│ │ │ ├── protocol
│ │ │ │ ├── BitfieldMatcher.java
│ │ │ │ ├── CancelMatcher.java
│ │ │ │ ├── EqualityMatcher.java
│ │ │ │ ├── HandshakeMatcher.java
│ │ │ │ ├── HaveMatcher.java
│ │ │ │ ├── PieceMatcher.java
│ │ │ │ ├── ProtocolBuilder.java
│ │ │ │ ├── ProtocolTestBuilder.java
│ │ │ │ ├── ProtocolTest.java
│ │ │ │ └── RequestMatcher.java
│ │ │ └── torrent
│ │ │ └── selector
│ │ │ └── UpdatablePieceStatistics.java
│ │ └── resources
│ │ └── bt
│ │ └── it
│ │ └── fixture
│ │ ├── file.txt
│ │ ├── file.txt.torrent
│ │ └── no-files.torrent
│ └── test
│ ├── java
│ │ └── bt
│ │ ├── data
│ │ │ ├── BitfieldTest.java
│ │ │ ├── ChunkDescriptor_FileStorageUnitTest.java
│ │ │ ├── ChunkDescriptorTest.java
│ │ │ ├── ChunkDescriptorTestUtil.java
│ │ │ ├── DataDescriptor_DataReaderTest.java
│ │ │ ├── digest
│ │ │ │ └── JavaSecurityDigesterTest.java
│ │ │ ├── file
│ │ │ │ ├── MockFileSystem.java
│ │ │ │ └── PathNormalizerTest.java
│ │ │ ├── MockStorageUnit.java
│ │ │ ├── range
│ │ │ │ ├── ByteRange_ExceptionsTest.java
│ │ │ │ └── ByteRangeTest.java
│ │ │ ├── ReadWriteDataRange_ExceptionsTest.java
│ │ │ ├── ReadWriteDataRange_SubrangeExceptionsTest.java
│ │ │ ├── ReadWriteDataRange_SubrangeTest.java
│ │ │ ├── ReadWriteDataRangeTest.java
│ │ │ ├── TestFileSystemStorage.java
│ │ │ └── UnitAccess.java
│ │ ├── it
│ │ │ ├── pex
│ │ │ │ └── PeerExchange_IT.java
│ │ │ ├── Swarm_EncryptedIT.java
│ │ │ ├── Swarm_IT.java
│ │ │ ├── Swarm_LocalServiceDiscoveryIT.java
│ │ │ └── Swarm_MagnetIT.java
│ │ ├── magnet
│ │ │ └── MagnetUriParserTest.java
│ │ ├── metainfo
│ │ │ └── MetadataServiceTest.java
│ │ ├── net
│ │ │ ├── BigIntegersTest.java
│ │ │ ├── buffer
│ │ │ │ ├── BuffersTest.java
│ │ │ │ └── SplicedByteBufferViewTest.java
│ │ │ ├── ByteChannelReader_TimedReadTest.java
│ │ │ ├── ByteChannelReader_TimedSyncTest.java
│ │ │ ├── LimitingChannel.java
│ │ │ ├── pipeline
│ │ │ │ ├── InboundMessageProcessor_BufferRotationTest.java
│ │ │ │ └── InboundMessageProcessorTest.java
│ │ │ ├── ReadByBlockChannel.java
│ │ │ └── ReadByBlockChannelTest.java
│ │ ├── peer
│ │ │ └── lan
│ │ │ ├── AnnounceMessageTest.java
│ │ │ └── CookieTest.java
│ │ ├── protocol
│ │ │ ├── Protocol_CorrectDataTest.java
│ │ │ ├── Protocol_InsufficientDataTest.java
│ │ │ ├── Protocol_InvalidDataTest.java
│ │ │ ├── Protocol_InvalidDeclaredLengthTest.java
│ │ │ └── ProtocolsTest.java
│ │ ├── runtime
│ │ │ ├── BtRuntimeBuilderTest.java
│ │ │ ├── OverridenApplicationService.java
│ │ │ └── TestModuleProvider.java
│ │ ├── service
│ │ │ └── ClasspathApplicationServiceTest.java
│ │ ├── TestUtil.java
│ │ ├── torrent
│ │ │ ├── BaseBitfieldTest.java
│ │ │ ├── compiler
│ │ │ │ └── MessagingAgentCompilerTest.java
│ │ │ ├── maker
│ │ │ │ └── TorrentMakerTest.java
│ │ │ ├── messaging
│ │ │ │ └── RoutingPeerWorker_WithCompilerTest.java
│ │ │ └── selector
│ │ │ ├── RarestFirstSelectorTest.java
│ │ │ └── SequentialSelectorTest.java
│ │ └── tracker
│ │ ├── MultiTrackerTest.java
│ │ └── udp
│ │ ├── SingleClientUdpTracker.java
│ │ ├── UdpMessageWorkerTest.java
│ │ ├── UdpTrackerConnection.java
│ │ └── UdpTrackerTestExecutor.java
│ └── resources
│ ├── bt
│ │ └── metainfo
│ │ ├── multi_file.torrent
│ │ ├── single_file_info_dictionary.bin
│ │ └── single_file.torrent
│ └── META-INF
│ └── services
│ └── bt.module.BtModuleProvider
├── bt-upnp
│ ├── pom.xml
│ ├── README.md
│ └── src
│ └── main
│ ├── java
│ │ └── bt
│ │ └── portmapping
│ │ └── upnp
│ │ ├── jetty
│ │ │ └── JettyAsyncUpnpServiceConfiguration.java
│ │ ├── UpnpPortMapper.java
│ │ ├── UpnpPortMapperModule.java
│ │ ├── UpnpPortMapperModuleProvider.java
│ │ └── UpnpPortMappingServicesRegistrar.java
│ └── resources
│ └── META-INF
│ └── services
│ └── bt.module.BtModuleProvider
├── codecov.yml
├── doc
│ └── javadoc
│ └── overview.html
├── examples
│ ├── pom.xml
│ └── src
│ └── main
│ ├── java
│ │ ├── datasharing
│ │ │ ├── Leecher.java
│ │ │ └── Seeder.java
│ │ ├── peertracker
│ │ │ ├── MagnetLinkFileReader.java
│ │ │ ├── Main.java
│ │ │ ├── PeerStats.java
│ │ │ ├── README.md
│ │ │ └── StatsDumper.java
│ │ └── yourip
│ │ ├── Main.java
│ │ ├── mock
│ │ │ ├── MockModule.java
│ │ │ ├── MockStorage.java
│ │ │ ├── MockStorageUnit.java
│ │ │ ├── MockTorrent.java
│ │ │ ├── MockTrackerFactory.java
│ │ │ ├── MockTracker.java
│ │ │ └── MockTrackerResponse.java
│ │ ├── README.md
│ │ ├── YourIP.java
│ │ ├── YourIPMessageHandler.java
│ │ ├── YourIPMessenger.java
│ │ └── YourIPModule.java
│ └── resources
│ └── log4j2.xml
├── findbugs.xml
├── jacoco-report
│ └── pom.xml
├── LICENSE
├── pom.xml
├── README.md
├── RELEASE-NOTES.md
├── script
│ ├── appveyor-install-jce.ps1
│ ├── deploy-release.sh
│ ├── git-merge-mldht.sh
│ ├── perform-release.sh
│ ├── prepare-release.sh
│ ├── travis-publish-codecov.sh
│ ├── travis-publish-javadoc.sh
│ ├── travis-publish-site.sh
│ ├── travis-publish-sonar.sh
│ └── travis-run-tests.sh
└── UPGRADE.md
221 directories, 755 files
标签:
小贴士
感谢您为本站写下的评论,您的评论对其它用户来说具有重要的参考价值,所以请认真填写。
- 类似“顶”、“沙发”之类没有营养的文字,对勤劳贡献的楼主来说是令人沮丧的反馈信息。
- 相信您也不想看到一排文字/表情墙,所以请不要反馈意义不大的重复字符,也请尽量不要纯表情的回复。
- 提问之前请再仔细看一遍楼主的说明,或许是您遗漏了。
- 请勿到处挖坑绊人、招贴广告。既占空间让人厌烦,又没人会搭理,于人于己都无利。
关于好例子网
本站旨在为广大IT学习爱好者提供一个非营利性互相学习交流分享平台。本站所有资源都可以被免费获取学习研究。本站资源来自网友分享,对搜索内容的合法性不具有预见性、识别性、控制性,仅供学习研究,请务必在下载后24小时内给予删除,不得用于其他任何用途,否则后果自负。基于互联网的特殊性,平台无法对用户传输的作品、信息、内容的权属或合法性、安全性、合规性、真实性、科学性、完整权、有效性等进行实质审查;无论平台是否已进行审查,用户均应自行承担因其传输的作品、信息、内容而可能或已经产生的侵权或权属纠纷等法律责任。本站所有资源不代表本站的观点或立场,基于网友分享,根据中国法律《信息网络传播权保护条例》第二十二与二十三条之规定,若资源存在侵权或相关问题请联系本站客服人员,点此联系我们。关于更多版权及免责申明参见 版权及免责申明
网友评论
我要评论