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

时间:2018-10-08 02:52:08

标签: javascript jquery html express socket.io

let print_data v =
    case v of
        I a -> show a
        F v -> show v
        S v -> v

如果我将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),则会显示系统消息。无论出于什么原因,它都不会将消息发送到特定的房间,它什么也不做,也没有错误。任何想法在这里出什么事吗?

2 个答案:

答案 0 :(得分:2)

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

请尝试以下操作,并根据需要进行调整:

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.第一节加入房间  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()

时重新使用

您最终会看到警报弹出:

enter image description here

答案 1 :(得分:1)

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 here上看到类似的示例。