3

大家好,我想弄清楚我的代码中的错误是什么,我的代码是关于 socket.io 和 redis pub/sub 这是我第一次尝试这个,希望你们能帮助我。

这是我的index.html

<!doctype html>
<html>
    <script src="/socket.io/socket.io.js"></script>
    <script> 
        var socket = new io.Socket();
        socket.connect();

        socket.on('connection', function (socket) {
            console.log('Connected');
        });

        socket.on('disconnect', function (socket) {
            console.log('Disconnected');
        });
    </script>
    <center>
    <h1>Test Page</h1>
    </center>
</html>

这是我的app.js

var redis = require('redis');
var app = require('http').createServer();
var io = require('socket.io').listen(app);
var client = redis.createClient();
var pub = redis.createClient();
var sub = redis.createClient();

app.listen(1234);

io.sockets.on('connection', function (socket){
    sub.on('subscribe', function (channel){
        pub.publish('Pub','Test Message 1');
        pub.publish('Pub','Test Message 2');
        pub.publish('Pub','Test Message 3');
    });
    sub.on('message', function (channel, message) {
        console.log(channel + ':' + message);
    sub.unsubscribe();
    pub.end();
    sub.end();
    });
    sub.incr('Channel Test');
    sub.incr('Pub');
});

我希望你能帮我修复这段代码。提前谢谢各位。

4

2 回答 2

3

我可以在您的代码中看到许多错误:

  • 在 index.html 中,您应该连接到http://localhost:1234/,因为它是在您的服务器代码中定义的。
  • var client没有在 app.js 中使用
  • sub永远不会订阅某事。您需要订阅一个频道
  • A connection in subscriber modecan not send commands to redis : 只有修改订阅集的命令才有效
  • sub.incr永远不会发布消息:您必须调用发布。
  • 不要打电话pub.end()sub.end()因为连接将被关闭。
  • 不要message在连接事件下向事件添加处理程序:内存泄漏

我不知道你到底想做什么,但这是一个更新的版本:

索引.html

<!doctype html>
<html>
    <script src="http://localhost:1234/socket.io/socket.io.js"></script>
    <script>
        var socket = io.connect('http://localhost:1234/');

        socket.on('connection', function (socket) {
            console.log('Connected');
        });

        socket.on('disconnect', function (socket) {
            console.log('Disconnected');
        });
    </script>
    <center>
    <h1>Test Page</h1>
    </center>
</html>

应用程序.js

var redis = require('redis');
var app = require('http').createServer();
var io = require('socket.io').listen(app);
var pub = redis.createClient();
var sub = redis.createClient();

app.listen(1234);

sub.subscribe('Pub');//subscribe to Pub channel
sub.on('message', function (channel, message) {
    console.log(channel + ':' + message);
});

io.sockets.on('connection', function (socket) {
    pub.publish('Pub', 'New Connection');
    pub.incr('Channel Test');   //increment 'Channel Test' but do not publish messages
    pub.incr('Pub');            //increment 'Pub' but do not publish messages
});
于 2013-09-11T08:51:51.780 回答
1

我没有看到您将 redis 设置为 socket.io 服务器中的存储。我做的一些例子供您参考:

// start up express server along with socket.io
var express = require('express');
var server = express();
var socket = require('socket.io');
var io = socket.listen(server);

// socket.io
io.set('store', new socket.RedisStore);

// set-up connections...
io.sockets.on('connection', function(socket) {

        io.emit('an event sent to all connected clients');

        socket.on('some-event', function(rooms) {
            ...
        });

});

您可以阅读以下文档链接:

  1. 配置 Socket.IO
  2. socket.io github 站点
于 2013-09-11T08:27:39.190 回答