我正在使用房间向客户端发送"私人"消息,它可以工作,但发送的消息与我拥有的客户端数量重复,我相信这是因为我的.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条相同的消息,重复的次数似乎就是我的客户端数量。。
尝试这个
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();
});
});
我认为你同时使用两个通道redis和socket.io,你必须制作一个通道,即socket.io只有这样,才不需要制作redis通道意味着当你通过emit/on传输数据时,不需要添加pub/sub方法。