新人求助:http.response做长链接数据流时,每隔14分钟左右会被断开 【已解决】
发布于 7 年前 作者 TadyCao 5443 次浏览 最后一次编辑是 5 年前 来自 问答

本人在用nodejs实现一个流媒体服务器,http协议;通过管道从编码器获取媒体二进制数据后,以长链接无限的大文件的形式向client输出(直播)。发现每隔14分钟左右,链接会中断,通过打日志确认与发送的数据长度无关;排除socket timeout的问题。目前无头绪,有高手了解不?

9 回复

这个14分钟时基于日志记录得出。 这个场景其实很像一个超大的文件下载,网速不够时,下载时间较长,会在14钟左右中断一次?——有人遇到类似情况吗?

会不会跟什么内存缓存之类的东西有关?

stream 的输入输出有速度差,stream在输出不给力的时候要暂停一下。

不懂,是不是跟v8内存有关系,我看书看的云里雾里的。说Buffer,不是用的v8内存

自己顶一下。这个问题应该在所有http静态文件服务器实现上都会遇到啊(使用http.response),只要连续传输时间超过14分钟左右,就会收到response.event.close消息。——都没遇到??

keep-alive ? http trunk ?

我建议写一个能够重现问题的最小程序,托管在Github上。其他人clone下来,寻找问题的原因。

否则,大家都是猜测。效率不高。

浏览器会主动断开已经连接了很长时间的http请求的

问题已解决。 确认不关http.response的事。服务response输出的数据是由ChlidProcess.stdout获得的,问题出在子进程在stderr不断输出内容,而ChildProcess.spawn会默认的帮你打开stderr管道,你如果不读取stderr内容,一段时间后stdout管道也会塞住不输出。正确的做法是如果子进程特定管道输出内容不需要处理,需要用“Ignore”设置之。例如: require(‘child_process’).spawn(‘prg’, [], { stdio: [‘pipe’, ‘pipe’, ‘ignore’] });

相关手册好像没有说明这个情况,折腾了好久,真心悲剧。

回到顶部