2014-06-18 35 views
4

我需要在nodejs中設置一個示例bittorrent跟蹤器,播種器和leecher。我寫了所有的代碼,但它不工作,我不知道爲什麼。我使用bittorrent-tracker啓動跟蹤器,使用nt寫入torrent文件,並使用bittorrent-tracker作爲播種器連接到跟蹤器(bt-tracker同時具有客戶端和服務器)。nodejs中的bittorrent tracker播種器和leecher

最後,我啓動了另一個只有torrent文件並連接到跟蹤器的客戶端。我能夠看到torrent中的文件(在下載/ leecher客戶端中)。但是文件下載本身不會啓動。


代碼中使用了: //追蹤:

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(); 

//代碼吸血

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) 
    }); 
    }) 
}) 

l上的數據事件eecher永遠不會被調用 - 即使它進入torrent的文件循環中!

+2

郵你認爲的代碼是犯罪嫌疑人。 – bloodyKnuckles

+0

爲追蹤器,上傳器和下載器添加了代碼。 – Param

回答

1

你想通過文件名createReadStream()我認爲。在任何情況下,檢查是否發出'錯誤'事件。

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

我在st和客戶端(在leecher文件中)都添加了一個錯誤處理程序,但是我沒有從相同的地方得到任何日誌記錄:-(另外 - 我爲leecher使用bittorrent-client lib - 在此顯示鏈接:https://www.npmjs.org/package/bittorrent-client,我不需要傳遞任何參數createReadStream。它只需要一些選項。 – Param

5

您需要使用實際的torrent客戶端來種子。現在,你只是使用bittorrent-tracker,它只是告訴跟蹤服務器你是一個播種機,但實際上並不包含任何代碼發送文件到同行,實際上,甚至不聽任何端口。要實際播種,您應該使用完整的torrent客戶端。

在您的示例中,您已使用bittorrent-client(由我撰寫),但我建議您轉到使用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.seedhttps://github.com/feross/webtorrent/blob/master/docs/api.md#clientseedinput-opts-function-onseed-torrent-