Nodejs请求代理流(mjpeg)连接永远不会结束

时间:2016-10-28 12:28:46

标签: node.js express proxy mjpeg

(不必要的背景故事) 我有一个带有expressjs框架的nodejs服务器,它代理流式传输网络摄像头。我需要这个的原因是因为复杂的CORS问题,mjpg流必须来自这个服务器。

//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,它实际上永远不会结束。当客户端(浏览器;目标)不再可用时,我需要找到一种强制关闭此管道的方法 - 例如,关闭窗口。

enter image description here

3 个答案:

答案 0 :(得分:1)

其他答案对我不起作用。 此行var pipe = request(url).pipe(res); 返回管道而不是请求对象。所以我需要打破界限。

需要中止请求对象。调用.end()也没有工作,但.abort()完成了这个工作。我花了几个小时才找到适合我的答案,所以我想我会分享。



{'A': ['apple'], 'B': ['banana', 'berry'], 'C': ['corn']}




答案 1 :(得分:0)

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

答案 2 :(得分:0)

我发现了一种更简单的方法。为客户端连接关闭添加事件侦听器,并在管道发生时强制关闭管道。

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