javascript - Socket.io - 无法向房间发送消息

标签 javascript jquery html express socket.io

socket.on('join room', function (data) {
    var room = data.room;
    var msg = "<span style='color:darkgreen;'>" + data.user + " has joined chat.</span>";

    socket.join(room, function () {
        console.log(socket.id + " now in rooms ", socket.rooms);
    });

    io.in(room).emit('system message', msg);
});

如果我将 io.in(room) 更改为 socket.broadcast,系统消息就会通过。不管出于什么原因,它不会向特定房间发送消息,它什么也不做,也没有错误。知道这里出了什么问题吗?

最佳答案

上面的代码似乎在后端,对吗?

尝试以下方法,必要时根据您的需要进行调整:

io.on('connection', function (socket) {
    // You should expect ONLY one user connected, 
    // > otherwise, you're creating multiple sessions :)
    console.log('a user connected');
    socket.on('join room', function (data) {
        var room = data.room;
        console.log('Room: ', room);
        var msg = "<span style='color:darkgreen;'>" + data.user + " has joined chat.</span>";

        socket.join(room); // No callback needed
        console.log(socket.id + " now in rooms ", socket.rooms);
        io.to(room).emit('system message', msg);
        // Change it to io.to(room)

    });
});

我注意到您要求加入前端使用:

$(".channelChange").click( function(evt) {
    var socket = io();
    $("#messages").html("");
    evt.stopPropagation();
    if($.inArray(evt.currentTarget, $(this).children())){
        console.log("user moved to " + evt.currentTarget.id);
    }
    setCookie("currentRoom", evt.currentTarget.id, 1);
    $(".roomName").html("<span class='3Dtext'>" + evt.currentTarget.id + "</span>");
    $("#enter-sound").get(0).play();
    getMessages(getCookie("currentRoom"));
    // Here you ask to join room
    socket.emit('join room', { user: getCookie("username"), room: getCookie("currentRoom") });
})

并在以下时间收到系统消息:

   $(function(){
        var socket = io();
        socket.on('system message', function(msg) {
            alert("test");
            $('#messages').append($('<div class="systemMessage">').html(msg));
            var height = $("#messages")[0].scrollHeight;
            $.mobile.silentScroll(height);
    });

如您所见,主要问题是您每次都调用 io(),这会创建不同的 session , 1. session 一加入房间 2. 另一个 session 将等待系统消息

因此,您需要一个单独的 io() session ,一个快速的解决方法是创建一个自调用函数:

const setIo = (function (){
        const _io = io();
        return () => _io;
    })()

然后将所有 io() 声明替换为:var socket = setIo();

例如:

$(".channelChange").click( function(evt) {
    var socket = setIo();
    $("#messages").html("");
    evt.stopPropagation();

这将创建一个单独的 io() session 而不是不同的 session ,并在您每次调用 setIo()

时重新使用它

您最终会看到警报弹出:

enter image description here

关于javascript - Socket.io - 无法向房间发送消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52694789/

相关文章:

javascript - 对数组的副本执行 unshift 方法

javascript - 在 Angular 中添加记录后附加 HTML

jquery - 在表单提交时获取数组中选中的复选框值

html - 如何使两边都具有 box-shadow 属性的阴影相等

html - 如何阻止 HTML/CSS 在页面之间将一行文本分成两半进行打印?

javascript - 定义两个具有相同参数的变量

Javascript bool 值 : false && true results in true

javascript - 在 map 上选择一个点并将其显示在输入上

javascript - 函数开始一遍又一遍地重复

jquery - 将 html 元素的 id 传递给 php