数据库
首页 > 数据库> > javascript – 如何在Redis / Node.js / Socket.io pub / sub设置中让不同的Web浏览器订阅单独的频道?

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