学习节点 - 书 - 第16-18页 - 两个例子

时间:2013-11-27 21:32:49

标签: javascript node.js asynchronous

这些页面16和18之间有两个例子。
示例1.3是服务器应用程序 例1.4是一个客户端应用程序,它向服务器发出GET请求。

当我运行这两个例子(同时)时,我注意到一些非常奇怪的行为 在客户端。执行所有请求(即客户端中的for循环完成)
但只有5个回调被调用。客户不退出,也是 没有错误。并且不再召唤回调。

任何想法可能会发生什么或我如何进一步解决这个问题?

注意:我在Windows 7上运行Node.js v0.10.20。


服务器

var http = require('http');
var fs = require('fs');

// write out numbers
function writeNumbers(res) {
    var counter = 0;
    // increment, write to client
    for (var i = 0; i<100; i++) {
        counter++;
        res.write(counter.toString() + '\n');
    }
}

// create http server
http.createServer(function (req, res) {
    var query = require('url').parse(req.url).query;
    var app = require('querystring').parse(query).file;

    // content header
    res.writeHead(200, {'Content-Type': 'text/plain'});

    if (!app){
        res.end();
        console.log('No file argument found in query string.');
        return;
    }else{
        app = app + ".txt";
    }

    // write out numbers
    writeNumbers(res);

    // timer/timeout to open file and read contents
    setTimeout(function() {
        console.log('Opening file: ' + app + '.');
        // open and read in file contents
        fs.readFile(app, 'utf8', function(err, data) {
            res.write('\r\n');
            if (err)
                res.write('Could not find or open file ' + app + ' for reading.\r\n');
            else {
                res.write(data);
            }
            // response is done
            res.end();
        });
    },2000);
}).listen(8124);
console.log('Server running at 8124');


客户端:


var http = require('http');

var N = 200;

// The URL we want, plus the path and options we need
var options = {
    host: 'localhost',
    port: 8124,
    path: '/?file=automatic',
    method: 'GET'
};

var callback_function = function(response) {
    // finished? ok, write the data to a file
    console.log('got response back');
};

for (var i = 1; i <= N; i++) {
    // make the request, and then end it, to close the connection
    http.request(options, callback_function).end();
    console.log('done with call # ' + i);
}


Screenshot while running both

---实验完成---

如果我将N降低到10并且如果我做了一个 全局“var i = 1”然后做这件事:

function schedule(){
    http.request(options, callback_function).end();
    console.log('done with call ' + i);
    i++;
    if (i<=N){
        setTimeout(function(){
            schedule();
        }, 1000);
    }
}

schedule();

而不是客户端中的循环,我得到类似的行为 我猜这就是Milimetric所谓的“睡眠”,即只是 确保我没有太快打中服务器 许多同时请求。

但行为并不完全相同,需要几分钟 在第二组5个请求上打印“得到回复” 然后另一个可能5-6分钟让客户退出。 尽管如此,对我来说这一切看起来都很奇怪。

C:\PERSONAL\NODE_TEST>node test004.js
done with call 1
got response back
done with call 2
got response back
done with call 3
got response back
done with call 4
got response back
done with call 5
got response back
done with call 6
done with call 7
done with call 8
done with call 9
done with call 10
got response back
got response back
got response back
got response back
got response back

C:\PERSONAL\NODE_TEST>

1 个答案:

答案 0 :(得分:1)

问题是客户端没有使用服务器发送的响应主体,因此连接保持(一半)打开,http代理默认只允许每个客户端5个并发请求,导致它在5个请求后挂起。连接最终会超时,导致接下来的5个请求被处理。

node.js http.get hangs after 5 requests to remote site

更改您的回调函数以使用在响应中发送的任何数据。

var callback_function = function(response) {
    // finished? ok, write the data to a file
    console.log('got response back');
    response.on('data', function () {});
};