【发布时间】:2011-04-13 15:19:02
【问题描述】:
我打算使用nodeJS作为我的comet服务器,我写了一些代码进行测试,但是有一个问题,当客户端第一次连接到服务器时,它无法得到服务器的响应。
这是服务器端代码(server.js):
var util = require('util');
var redis = require('redis').createClient(6379, '192.168.1.254');
var http = require('http');
redis.on("error", function (err) {
console.log("Error " + err);
});
var server = http.createServer(requestListener);
server.listen(9898, '192.168.1.254');
function requestListener(req, res) {
util.log('Connected.');
redis.brpoplpush('msg:q:1', 'msg:s:1', 20, function(err, reply) {
if (err) {
util.log('ERROR: ' + err);
}
var length = reply ? reply.length : 0;
res.writeHead(200, {
'Content-Type':'text/plain',
'Content-Length':length
});
if (length) {
res.end(reply);
util.log('Sent: ' + reply);
} else {
res.end('');
}
});
}
以及客户端代码(client.sh):
#!/bin/bash
while [ 1 ]
do
curl -i http://192.168.1.254:9898
done
我按照以下步骤对其进行了测试:
- 节点服务器.js
- ./client.sh
- 在 redis 中,LPUSH('msg:q:1', 'blablah')
现在,控制台上打印了“Sent: blablah”,res.end(reply) 已执行,但客户端什么也没收到。我多次重复第 3 步,然后它按预期工作。如果我重新启动客户端,则无法再次收到前几个响应。
我该如何解决这个问题?
【问题讨论】:
-
尽量不要使用无限的while循环,而只是有一个for循环最多5或10。然后看看它是否仍然发生。
-
Raynos:谢谢。客户端处于阻塞模式,等待响应。如果我只是执行命令'curl -i http://...',没有任何改变,仍然无法得到响应。
-
好像是redis的东西。对我来说,节点代码看起来不错。
-
尝试在 redis-cli 上运行 MONITOR 命令,看看是否一切正常
标签: javascript http node.js comet redis