socket.io rooms每个客户端重复相同的消息

时间:2015-11-02 12:15:50

标签: javascript node.js websocket socket.io

我正在使用房间发送一个私人的'消息给客户端然后它工作但是发送的消息是由我拥有的客户端数量复制的,我相信这是因为我.on('message')因为这仍然触发每个客户端但只发送到正确的客户端(但多次..)

服务器

io.sockets.on('connection', function(socket {
    socket.on('join', function(data)
    {
        console.log('enter');
        socket.join(data.user);
});

var rClient =   redis.createClient();
rClient.subscribe('messagex');

rClient.on('message', function(channel, message) {
    io.in(message.user).emit('messagex', {content: message.content});
});

socket.on('disconnect', function() {
    rClient.quit();
});

});

接收方客户端

<script>
var username = prompt("test");
var socket  =   io.connect('http://localhost:8100');
socket.emit('join', {user: username});

socket.on('messagex', function(data) {
    $('#messages').append('<p>' + data.content + '</p>');
});

所以我在接收器页面上有3个客户端(每个客户端/房间打开不同),我从发送者发送消息说用户user1,然后我只会在user1客户端收到消息,但它会收到3个每次都是相同的消息,重复的次数似乎是我拥有的客户数量。

2 个答案:

答案 0 :(得分:0)

试试这个

subscribe.unsubscribe(channel); 

连接断开取消订阅时

io.sockets.on('connection', function(socket {
socket.on('join', function(data)
{
    console.log('enter');
    socket.join(data.user);
});

var rClient =   redis.createClient();
rClient.subscribe('messagex');

rClient.on('message', function(channel, message) {
    io.in(message.user).emit('messagex', {content: message.content});
});

socket.on('disconnect', function() {

rClient.unsubscribe('messagex'); 
  rClient.quit();
});
});

答案 1 :(得分:0)

我认为你同时使用两个频道redis和socket.io,你必须制作单个频道,即socket.io只有这时才需要制作redis频道意味着当你转移时不需要添加pub / sub方法数据通过emit / on。