繁体   English   中英

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

[英]Socket.io - Cannot send messages to rooms

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 ,系统消息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() ,这会创建不同的会话,1。会话1加入会议室2.不同的会话将等待系统消息

因此,你需要一个单独的io()会话,快速的工作是创建一个自我调用函数:

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

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

如:

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

这将创建单个io()会话而不是不同的会话,并在每次调用setIo()重新使用它

您最终会看到弹出警报:

在此输入图像描述

socket.join()是异步的。 当你试图发送到房间时,它还没有完成,所以没有消息进入该套接字,因为它还没有进入房间。 所以,改变这个:

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

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

对此:

socket.join(room, function () {
    console.log(socket.id + " now in rooms ", socket.rooms);
    io.in(room).emit('system message', msg);
});

所以,在这个新版本中,你不会发送到房间,直到.join()完成而不是之前。

你可以在socket.io doc中看到一个类似的例子。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM