CNode

新人求助:http.response做长链接数据流时,每隔14分钟左右会被断开 【已解决】

问答
TTadyCao发布于12 年前最后回复12 年前9 回复7064 浏览0 收藏

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

查看回复

回复 (9)

T
TadyCao#1·12 年前

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

A
alsotang#2·12 年前

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

L
leapon#3·12 年前

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

M
motecshine#4·12 年前

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

T
TadyCao#5·12 年前

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

S
sioncheng#6·12 年前

keep-alive ? http trunk ?

B
bnuhero#7·12 年前

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

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

1
151263#8·12 年前

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

T
TadyCao#9·12 年前

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

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

参与回复
登录后即可参与回复。登录