当我尝试利用http流连接出于某种原因时,写入不会刷新,直到我打电话
到Response.End()
我直接从演示中获取代码并且不明白我的问题是什么
当我卷曲到服务器时,我的标题是正确的。
HTTP/1.1 200 OK
Content-Type: text/plain
Connection: keep-alive
Transfer-Encoding: chunked
var http = require('http');
http.createServer(function (req, res) {
res.writeHead(200, {'Content-Type': 'text/plain'});
res.write('hello');
res.write(':');
setTimeout(function(){
res.end('World\n')},
2000);
}).listen(1337, "127.0.0.1");
console.log('Server running at http://127.0.0.1:1337/');
为什么服务器没有发送写入数据?
答案 0 :(得分:6)
我似乎是浏览器特定的行为 - firefox立即显示数据(“Hello:”),而chrome似乎缓冲并等待响应结束。请注意,如果您首先编写更多数据,Chrome也会立即显示数据(例如,我写了1000个“Hello”)。
答案 1 :(得分:3)
我想我明白你的意思......
来自node.js docs:
第一次调用response.write()时,它会将缓冲的头信息和第一个主体发送到客户端。第二次调用response.write()时,Node假定您将要传输数据,并单独发送。也就是说,响应被缓冲到第一个身体块。
http://nodejs.org/docs/v0.4.7/api/all.html#response.write
(好的端口使用BTW :))
答案 2 :(得分:2)
尝试使用telnet或nc检查您的代码。 curl通常缓冲最后一行
答案 3 :(得分:0)
修复缺失的大括号后,您的代码正在从浏览器中为我工作。来自命令行的卷曲似乎等待完整的响应,但wireshark确认它确实使用了分块编码,并且在两种情况下都将响应拆分为2个包。
我假设curl输出是行缓冲的,并在打印之前等待'World'之后的换行符。您可以在'hello:'之后打印另一个换行符来确认这一点。
答案 4 :(得分:0)
这是因为您在res.end('World\n')
之后和逗号之前的代码中错过了封闭的“}”。