bittorrent跟踪器播种机和leecher在nodejs

我需要在nodejs中设置一个示例bittorrent跟踪器,播种器和leecher。 我写了所有的代码,但它不工作,我不知道为什么。 我使用bittorrent-tracker启动了tracker,使用nt编写torrent文件,使用bittorrent-tracker作为播种器连接到tracker(bt-tracker同时具有客户端和服务器)。

最后,我启动了另一个只有torrent文件并连接到跟踪器的客户端。 我能够看到洪stream中的文件(在下载/ leecher客户端)。 但是文件下载本身不会启动。


正在使用的代码:// Tracker:

var Server = require('bittorrent-tracker').Server var port=6881 var server = new Server({ udp: true, // enable udp server? [default=true] http: true // enable http server? [default=true] }) server.on('error', function (err) { // fatal server error! console.log(err.message) }) server.on('warning', function (err) { // client sent bad data. probably not a problem, just a buggy client. console.log(err.message) }) server.on('listening', function () { console.log('tracker server is listening!') }) // start tracker server listening! server.listen(port) // listen for individual tracker messages from peers: server.on('start', function (addr, params) { console.log('got start message from ' + addr) console.log('params in the message: ' + JSON.stringify(params)) }) server.on('complete', function (addr, params) {}) server.on('update', function (addr, params) {}) server.on('stop', function (addr, params) {}) // get info hashes for all torrents in the tracker server console.log(Object.keys(server.torrents)) 

//代表torrent文件的作者和播种者

 var nt=require('nt'); var fs=require('fs'); //var rs=nt.make('udp://tracker.publicbt.com:80'); //rs.pipe(fs.createWriteStream('param.torrent')); function postWrite(){ var cl=require('bittorrent-tracker').Client; var parseTorrent=require('parse-torrent'); var torrent=fs.readFileSync(__dirname + '/param.torrent'); var parsedTorrent=parseTorrent(torrent); console.log(parsedTorrent); var peerId = new Buffer('81276382172123141133') var port = 6882 var client = new cl(peerId, port, parsedTorrent) client.on('error', function (err) { console.log(err.message) // a tracker was unavailable or sent bad data to the client. you can probably ignore it }) client.start() client.on('update', function (data) { console.log('got an announce response from tracker: ' + data.announce) console.log('number of seeders in the swarm: ' + data.complete) console.log('number of leechers in the swarm: ' + data.incomplete) }) client.once('peer', function (addr) { console.log('found a peer: ' + addr) // 85.10.239.191:48623 }) // announce that download has completed (and you are now a seeder) client.complete(); client.update() } function writeTorrentFile() { nt.makeWrite('param.torrent', 'udp://hola.127.0.0.1.xip.io:6881', '/Users/param/personal/nodejs/uploader/files', // ['hello-world.txt'], function(err, torrent){ ['hello-world.txt'], {}, function(err, torrent){ console.log(err); console.log(torrent); nt.read('param.torrent', function(err, torrent) { if (err) throw err; console.log('Info hash:', torrent.metadata.info); }); postWrite(); }); } writeTorrentFile(); 

//代码为leecher

 var BitTorrentClient = require('bittorrent-client'); var fs = require('fs'); var file = fs.readFileSync(__dirname + '/param.torrent') var client = BitTorrentClient({ maxPeers: 100, // Max number of peers to connect to (per torrent) path: __dirname, // Where to save the torrent file data dht: true, // Whether or not to enable DHT verify: true // Verify previously stored data before starting }); client.add(file); client.on('torrent', function (torrent) { // torrent metadata has been fetched console.log(torrent.name) torrent.files.forEach(function (file) { console.log("selecting "+file.name+" for download"); console.log(file.path) st=file.createReadStream() st.on('data', function(chunk){ console.log(chunk) }); }) }) 

leecher上的数据事件永远不会被调用 – 即使它进入torrent的文件循环!

你需要使用一个真正的洪stream客户端种子。 现在,你只是使用bittorrent-tracker ,它只是告诉跟踪服务器,你是一个播种机,但实际上并没有包含任何代码发送文件到同行,实际上,甚至不听任何端口。 要实际种子,你应该使用一个完整的洪stream客户端。

在你的例子中,你已经使用了bittorrent-client (由我创作),但是我build议你转移到使用webtorrent因为我webtorrent弃用了bittorrent-client

这是一些种子文件的代码:

 var WebTorrent = require('webtorrent') var client = new WebTorrent() client.seed('/path/to/file', function (torrent) { console.log('Client is seeding:', torrent.magnetUri) }) 

以下是关于client.seed完整文档: https : //github.com/feross/webtorrent/blob/master/docs/api.md#clientseedinput-opts-function-onseed-torrent-

你想传递一个文件名到createReadStream()我想。 在任何情况下,检查是否发生“错误”事件。

 // ... var st = file.createReadStream(file) st.on('data', console.log); st.on('error', console.error);