Nodejs запрос прокси-потока (mjpeg) соединение никогда не заканчивается

(ненужная предыстория) У меня есть сервер nodejs с платформой expressjs, который прокси передает поток веб-камеры. Причина, по которой мне это нужно, заключается в том, что поток mjpg должен исходить с этого сервера из-за сложных проблем CORS.

//proxy from webcam server to avoid CORS complaining
app.get('/stream1',function(req,res){
    var url="http://camera.nton.lviv.ua/mjpg/video.mjpg"
    request(url).pipe(res);
});

вопрос: Вопрос простой. request(url).pipe(res) никогда не закрывается, потому что источником является mjpeg, который буквально никогда не заканчивается. Мне нужно найти способ принудительно закрыть этот канал, когда клиент (браузер; пункт назначения) больше не доступен - например, закрывает окно.

введите описание изображения здесь


person Gyuhyeon Lee    schedule 28.10.2016    source источник
comment
Вам нужно будет использовать веб-сокет или какой-либо метод длительного объединения, чтобы проверить, доступен ли клиент.   -  person mattdevio    schedule 28.10.2016


Ответы (3)


Другие ответы не помогли мне. Эта строка var pipe = request (url) .pipe (res); возвращает канал вместо объекта запроса. Так что мне нужно было разбить состав.

Объект запроса необходим для прерывания. Вызов .end () тоже не сработал, но .abort () помогло. Мне потребовались часы, чтобы найти ответ, который работал для меня, поэтому я подумал, что поделюсь.

   app.get('/cam/frontdoor',function(req,res){

        var request_options = {
            auth: {
                user: '',
                pass: ''},
            url: 'http:/xx.xx.xx.xx/mjpg/video.mjpg',
        };

        var req_pipe = request(request_options);
        req_pipe.pipe(res);

        req_pipe.on('error', function(e){
            console.log(e)
        });
        //client quit normally
        req.on('end', function(){
            console.log('end');
            req_pipe.abort();

        });
        //client quit unexpectedly
        req.on('close', function(){
            console.log('close');
            req_pipe.abort()

        })


    })

person twitzel    schedule 03.11.2016

Используйте socket.io для мониторинга удаленного подключения

// install it on your project
npm install socket.io

// require it on server side
var socket = require('socket.io');

// listen for sockets from your server
var mysocks = socket.listen(myexpressappvar);

// keep collection of sockets for use if needed
// its good practice
var connectedSockets = [];

// add event handelers on server side
mysocks.sockets.on("connection", function(socket){
    
    // add socket to our collection
    connectedSockets.push(socket);
  
    // you will need to bind their stream id here.
    exe.....
    
    // listen for disconnected
    socket.on("disconnect", function(){
       // remove socket from collection 
       connections.splice(connections.indexOf(socket), 1);
       // destory stream here
       exe...
    });   
});
  
// last thing, is add socket.io to the client side.
<script src="/socket.io/socket.io.js"></script>

// then call connect from client side js file
var socket = io.connect();

person mattdevio    schedule 28.10.2016
comment
спасибо за ответ, но я думаю, что нашел более простой подход! :) Спасибо ~ - person Gyuhyeon Lee; 28.10.2016

Я нашел способ попроще. Добавьте прослушиватель событий для закрытия клиентского соединения и принудительно закройте канал, когда это произойдет.

app.get('/stream1',function(req,res){
    var url="http://camera.nton.lviv.ua/mjpg/video.mjpg"
    var pipe=request(url).pipe(res);
    pipe.on('error', function(){
        console.log('error handling is needed because pipe will break once pipe.end() is called')
    }
    //client quit normally
    req.on('end', function(){
        pipe.end();
    }
    //client quit unexpectedly
    req.on('close', function(){
        pipe.end();
    }
});
person Gyuhyeon Lee    schedule 28.10.2016
comment
Вам это подходит? В моем случае проксируемый поток очень медленный (в отличие от исходного потока mjpg). - person ecdeveloper; 02.04.2018
comment
@ecdeveloper привет, это что-то вроде некро - прошло уже 2 года, поэтому я не уверен. У меня никогда не было проблемы с медленным прокси-потоком. Однако самая большая проблема заключалась в том, что проблема CORS продолжала появляться, даже если Access-Control-Allow-Origin = * был установлен правильно. Я бы рекомендовал пересмотреть решение о прокси-сервере этого потока mjpeg (сам формат файла действительно старый, и браузеры, похоже, больше не поддерживают его. Файлы mjpeg не работают с заголовками CORS - это браузер Chrome ошибка. Возможно, вы пытаетесь использовать прокси, чтобы обойти это, но я не рекомендую.) - person Gyuhyeon Lee; 02.04.2018
comment
Таким образом, я не уверен, почему ваш поток медленный (может быть, медленный сервер?) && Я не уверен, что было бы лучшим способом проксировать поток mjpeg в node.js && Я уверен, что проблема CORS будет проблема, если вы попытаетесь получить его прямо из браузера, чтобы использовать такие вещи, как p5js, для обработки этого изображения с помощью javascript на стороне клиента, && Я предлагаю поискать альтернативы (другой формат файла и т. д. mjpeg просто очень медленный и лагает, потому что он отправляет несколько jpeg непрерывно) - person Gyuhyeon Lee; 02.04.2018