2015-11-02 364 views
1

我使用房间发送一个'私人'消息到客户端,它的工作原理但是发送的消息是由我拥有的客户端数量重复的,我相信这是因为服务器的我.on('message'),因为这仍然是触发为每个客户端而只发射到正确的客户端(但多次..)每个客户端重复相同的消息的socket.io房间

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条相同的消息,重复的次数似乎是我拥有的客户端数量。

+1

为什么使用'订阅'?只需使用一个房间向该特定用户广播该消息 – Subham

+0

我使用redis并从php发布。发送'''消息时,我不会从客户端发送到服务器 – joe

回答

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(); 
}); 
}); 
0

我认为你正在使用的同一时间的Redis和socket.io双通道,你必须要单通道即socket.io才就没有必要做的Redis通道意味着当您通过发射/打开传输数据时不需要添加发布/订阅方法。