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

socket.io rooms repeating same message per client

本文关键字:消息 客户端 io 房间 socket      更新时间:2023-09-26

我正在使用房间向客户端发送"私人"消息,它可以工作,但发送的消息与我拥有的客户端数量重复,我相信这是因为我的.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方法。