![](/img/trans.png)
[英]Node.js, Socket.io, Redis pub/sub high volume, low latency difficulties
[英]redis pub/sub with socket.io in node.js
我创建了简单的聊天应用程序。 因此我使用了node.js我在网上看到了许多简单的例子,所有人都说代码工作正常。 但是当我尝试该代码时,它并没有给我正确的结果。
它抛出错误“丢弃运输”
我已阅读以下页面:1) 在socket.io中使用RedisStore的示例 2) http://www.ranu.com.ar/2011/11/redisstore-and-rooms-with-socketio.html 3) socket.io广播功能和Redis发布/订阅架构 4) 我在我的集群node.js / socket.io / redis pub / sub应用程序中收到重复消息等等...
以下是我的代码:
服务器端代码:app.js ~~~~~~~~~~~~~~~~~~~~~~~~~
var app = express.createServer();
app.listen(process.env.PORT);
var io = require('socket.io').listen(app);
var store = redis.createClient();
var pub = redis.createClient();
var sub = redis.createClient();
var io = require('socket.io').listen(app);
io.configure(function () {
// io.enable('browser client minification'); // send minified client
// io.enable('browser client etag'); // apply etag caching logic based on version number
// io.enable('browser client gzip'); // gzip the file
io.set('log level', 3);
io.set("transports", ["jsonp-polling", "xhr-polling", "websocket", "flashsocket", "htmlfile"]);
io.set("polling duration", 10);
io.set("flash policy server", false);
io.set("connect timeout", 500);
io.set("reconnect", true);
// io.set('close timeout', 60 * 60 * 24); // 24h time out
io.set('close timeout', 25);
io.disable('heartbeats');
io.set('heartbeat interval', 20);
io.set('heartbeat timeout', 60);
// io.set("polling duration", 10);
// io.set("heartbate timeout", 30);
//console.log("blabla");
//var RedisStore = require('socket.io/lib/stores/redis');
//io.set('store', new RedisStore({ redisPub: pub, redisSub: sub, redisClient: store }));
//io.set('store', new RedisStore());
});
io.sockets.on('connection', function (client) {
client.on("OnConnect", function (data, fn) {
console.log("socket id : " + client.id + " connected !!!");
});
client.on('disconnect', function () {
console.log("\r\nmanish from server->disconnect");
// client.broadcast(client.sessionId + " disconnected")
client.emit('user disconnected');
sub.unsubscribe("chat");
sub.quit();
});
sub.subscribe("chat");
sub.on("message", function (channel, message) {
console.log("message received on server from publish : '" + message + "'");
client.send(message);
});
});
});
客户端代码:index.html ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
this.Connect = function (nick, room) {
socket = io.connect('http://XXX.XXX.X.XX', { transports: ['jsonp-polling', 'xhr-polling'] });
Nickname = nick;
Room = room;
// setInterval(function () { socket.emit("keep-alive", null) }, 20 * 1000);
socket.on('connect', function (data) {
socket.emit('OnConnect', { nick: nick, room: room }, function (response) {
$("#board").append("<p>" + response.msg + "</p>");
});
});
socket.on("message", function (msg) {
alert("message received on client ...");
$("#board").append("<p>" + msg +"</p>");
});
server.on("listening", function () {
var address = server.address();
console.log("server listening " + address.address + ":" + address.port);
});
socket.emit("message", { msg: msg, nick: Nickname }, function (response) {
$("#board").append("<p> send message : " + Nickname + ": " + msg + "</p>");
});
};
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ,~~~~~~~~~~
意味着我在一个浏览器中运行这个应用程序(比如Firefox,并发送一些消息到第二个连接,让我们说IE)
但是在console.log中显示以下错误
debug:设置请求GET /socket.io/1/jsonp-polling/Th9U-Zci8cVb5Wfwl24Y?t=1345123231804&i=0 debug:设置轮询超时debug:客户端授权调试:清除轮询超时debug:jsonppolling写入io.j0; debug:为客户端设置关闭超时Th9U-Zci8cVb5Wfwl24Y socket id:Th9U-Zci8cVb5Wfwl24Y连接!!! 服务器从发布收到的消息:'msg 1'debug:设置请求GET /socket.io/1/jsonp-polling/Th9U-Zci8cVb5Wfwl24Y?t=1345123231804&i=0 debug:设置轮询超时调试:客户端授权进行调试:清除轮询timeout debug:jsonppolling写入io.j0; debug:为客户端设置关闭超时Th9U-Zci8cVb5Wfwl24Y socket id:Th9U-Zci8cVb5Wfwl24Y连接!!! 服务器从发布收到的消息:'msg 1'debug:fired close客户端的超时Th9U-Zci8cVb5Wfwl24Y info:传输结束(关闭超时)debug:丢弃传输
Socket.io房间开箱即用,您无需订阅redis或任何东西。
尝试使用自定义连接功能
client.on("OnConnect", function (data, fn) {
console.log("socket id : " + client.id + " connected !!!");
client.join(data.room);
});
此外,您不需要取消订阅房间,但如果您这样做,应该是这样的
client.on('disconnect', function () {
console.log("\r\nmanish from server->disconnect");
client.emit('user disconnected');
client.leave("chat");
});
将消息发送到聊天室是通过client.broadcast.to('chat')。emit('message');
您可以在https://github.com/LearnBoost/socket.io/wiki/Rooms上阅读更多关于房间的信息。
祝好运!
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.