Я пытаюсь создать / развернуть сервер отслеживания для использования с приложениями P2P, используя приведенный ниже код. Он отлично работает локально, но когда я развертываю его на Heroku, привязки портов не работают, потому что разрешен только один порт.

    // Create a web sockets signaling server
    var express = require('express');
    var bodyParser = require('body-parser');
    var app = express();

    //Allow all requests from all domains & localhost
    app.all('/*', function(req, res, next) {
        res.header("Access-Control-Allow-Origin", "*");
        res.header("Access-Control-Allow-Headers", "X-Requested-With, Content-Type, Accept");
        res.header("Access-Control-Allow-Methods", "POST, GET");
        next();
    });

    app.use(bodyParser.json());
    app.use(bodyParser.urlencoded({extended: false}));

    let lookup = {}

    const hostname = '0.0.0.0';
    const port = process.env.PORT;

    var Server = require('bittorrent-tracker').Server

    var server = new Server({
        udp: false, // enable udp server? [default=true]
        http: true, // enable http server? [default=true]
        ws: true, // enable websocket server? [default=true]
        stats: true, // enable web-based statistics? [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 () {
        // fired when all requested servers are listening
        console.log('Signal server http port:' + server.http.address().port)
        console.log('Signal server ws port:' + server.ws.address().port)
    })

    // start tracker server listening! Use 0 to listen on a random free port.
    server.listen(port, hostname, 'listening')

    // listen for individual tracker messages from peers:
    server.on('start', function (addr) {
        console.log('got start message from ' + addr)
        Object.keys(server.torrents).forEach(hash => {
            lookup[server.torrents[hash].infoHash] = server.torrents[hash].peers.length
            console.log("peers: " + server.torrents[hash].peers.length)
        })
    })

    server.on('complete', function (addr) {})
    server.on('stop', function (addr) {})

    app.get('/peers', function(req, res) {
        res.send(lookup);
    })

    app.listen(process.env.PORT, function() {
        console.log('Express server port: ' + this.address().port); //Listening on port #
    })

Если я использую process.env.PORT как для server, так и для app, я получаю следующее, чего и следовало ожидать, поскольку Heroku разрешает только 1 порт прослушивания:

2021-02-13T05:35:31.016101+00:00 heroku[web.1]: State changed from starting to up
2021-02-13T05:35:30.885170+00:00 app[web.1]: Express server port: 9898
2021-02-13T05:35:30.885204+00:00 app[web.1]: listen EADDRINUSE: address already in use 0.0.0.0:9898
2021-02-13T05:35:30.885205+00:00 app[web.1]: listen EADDRINUSE: address already in use 0.0.0.0:9898

Если я жестко запрограммирую порт для server или app, приложение запускается нормально, но сервер сигнализации не работает. Никаких существенных журналов не создается.

2021-02-13T05:38:21.141806+00:00 heroku[web.1]: State changed from starting to up
2021-02-13T05:38:20.998054+00:00 app[web.1]: Express server port: 25702
2021-02-13T05:38:20.998550+00:00 app[web.1]: Signal server http port:31415
2021-02-13T05:38:20.998683+00:00 app[web.1]: Signal server ws port:31415

Возможно ли, что сервер bittorrent-tracker и сервер express могут использовать один и тот же порт? Например, могу ли я получить и вернуть список пиров в этом блоке кода вообще без необходимости в express?

    server.on('start', function (addr) {
        console.log('got start message from ' + addr)
        // Could I do something here to eliminate the need for Express?
        Object.keys(server.torrents).forEach(hash => {
            lookup[server.torrents[hash].infoHash] = server.torrents[hash].peers.length
            console.log("peers: " + server.torrents[hash].peers.length)
        })
    })

В документации говорится:

HTTP-сервер будет обрабатывать запросы по следующим путям: / announce, / scrape. Запросы по другим путям не обрабатываются.

Но, возможно, есть какой-то способ, которым я могу управлять запросами, которые обрабатывает express?

1
Dshiz 13 Фев 2021 в 09:11

1 ответ

Лучший ответ

Вскоре после того, как я задал этот вопрос, мне пришло в голову, что мне может вообще не понадобиться express. Оказывается, это было правильно.

Для тех, кому нужен битторрент-трекер, готовый к Heroku, вот обновленный код:

// Create a web sockets signaling server
let lookup = {}

const hostname = '0.0.0.0';
const port = process.env.PORT;


var Server = require('bittorrent-tracker').Server

var server = new Server({
    udp: false, // enable udp server? [default=true]
    http: true, // enable http server? [default=true]
    ws: true, // enable websocket server? [default=true]
    stats: true, // enable web-based statistics? [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 () {
    // fired when all requested servers are listening
    console.log('Signal server http port:' + server.http.address().port)
    console.log('Signal server ws port:' + server.ws.address().port)
})

// start tracker server listening! Use 0 to listen on a random free port.
server.listen(port, hostname, 'listening')

// listen for individual tracker messages from peers:
server.on('start', function (addr) {
    console.log('got start message from ' + addr)
    Object.keys(server.torrents).forEach(hash => {
        lookup[server.torrents[hash].infoHash] = server.torrents[hash].peers.length
        console.log("peers: " + server.torrents[hash].peers.length)
    })
})

server.on('complete', function (addr) {})
server.on('stop', function (addr) {})
0
Dshiz 13 Фев 2021 в 06:40