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