javascript – 如何在Redis / Node.js / Socket.io pub / sub设置中让不同的Web浏览器订阅单独的频道?
作者:互联网
我希望不同的客户端(Web浏览器)能够订阅单独的Redis频道.
我能够将请求的通道从客户端页面传递到node.js服务器.但是,如果我有三个浏览器订阅,每个订阅三个单独的频道,所有三个浏览器接收发布到三个频道中的任何一个的消息.
这是客户端HTML代码.我有三个单独的页面,其中频道名称是硬编码的.在此示例中,通道为“channel1”.
client1.html
<script src="/socket.io/socket.io.js"></script>
<script>
var socket = io.connect('http://localhost');
socket.on('giveChannel', function () {
console.log('sending channel');
socket.emit('sendChannel', "{\"channel\":\"channel\"}");
});
socket.on('message', function (data) {
console.log(data);
});
</script>
这是Node.js文件.
app.js
redis = require('redis'),
sys = require('sys');
var http = require('http');
var url = require('url');
var fs = require('fs');
var server = http.createServer(function (req, res) {
var path = url.parse(req.url).pathname;
fs.readFile(__dirname + path, function(err, data) {
if (err) return null;
res.writeHead(200, {'Content-Type': 'text/html'});
res.write(data, 'utf8');
res.end();
});
});
io = require('socket.io').listen(server);
io.sockets.on('connection', function (socket) {
var rc = redis.createClient();
rc.on("connect", function() {
sys.log('connected to redis');
});
rc.on("message", function (channel, message) {
sys.log("Sending: " + message);
io.sockets.emit('message', message);
});
socket.emit('giveChannel');
socket.on('sendChannel', function (msg) {
console.log(msg);
var data = JSON.parse(msg);
console.log(data.channel);
rc.subscribe(data.channel);
});
});
server.listen(8000, '0.0.0.0');
解决方法:
根据您的示例,APP将为每个用户打开一个新的redis连接,这没有意义.
这对于整个应用程序使用一个连接(您必须再为连接作业发布数据)
客户端
var socket = io.connect('http://localhost:3000');
socket.emit('channel','US');
socket.on('news',function(news){
$("body").append('<br/>' + news);
});
socket.on('message',function(msg){
$("body").append('<br/>' + msg);
});
服务器端
var io = require('socket.io');
var express = require('express');
var app = express.createServer();
io = io.listen(app);
app.listen('3000');
var pub = require('node_redis').createClient(); //publish cli
var redis = require('node_redis').createClient(); //sub cli
redis.psubscribe('*');
redis.on('pmessage',function(pat,ch,msg){
io.sockets.in(ch).emit('news',msg);
});
io.sockets.on('connection',function(socket){
console.log('Socket connected: ' + socket.id);
socket.on('channel',function(ch){
socket.join(ch)
//Publishing data on ch
pub.publish(ch,"Hello " + ch);
});
socket.on('disconnect',function(){
console.log('Socket dis connected: ' + socket.id);
});
});
console.log('Server started @ 3000');
标签:javascript,redis,node-js,socket-io,publish-subscribe 来源: https://codeday.me/bug/20190826/1732570.html