首页 > 解决方案 > 使用 SocketIO 如何检查在房间内广播时未发送消息?

问题描述

我有一个 Web 套接字应用程序并使用 socketIO 向服务器发送消息以与第二个页面进行交互。

第 1 页向服务器发送消息,服务器告诉第 2 页做某事。这很好用,因为我有很多不同的页面这样做,所以我正在使用 SocketIO 的“房间”功能:

第 1 页

function tryClose(shortCode) { //shortCode is the room name
  console.log('Trying to close ' + shortCode)
  socket.emit('closePlease', shortCode);
}

==================================================== ========================= 服务器

socket.on('closePlease', function (data) {      
  //Send a request to any open sessions with an active browser to close the session
  io.sockets.in(data).emit('closePlease');
});

==================================================== ========================= 第 2 页

socket.on('closePlease', function () {
  console.log ('Remote request to close session received!')
  //close the modal and display main menu.
  
  socket.emit('leaveRoom', shortCode)

});

leaveRoom如果用户失去与服务器的连接或网页已关闭而未触发“leaveRoom”味精,则我的问题开始于味精未返回到服务器的位置。如果网络被删除并且浏览器关闭,这是可能的,并且会导致我的 NodeJS 应用程序中的许多对象和数组保持打开状态。“leaveRoom”流程旨在处理这些问题。

如何修改服务器功能,以便在无法将“closePlease”消息传递到页面时,在服务器上执行“leaveRoom”功能?

我确实查看了回调,但在房间内广播时遇到了关于无法使用回调的错误消息。

我正在使用 SocketIO 版本:“^2.3.0”,

标签: websocketsocket.io

解决方案


结束了以下。关键在于这里的答案:linky

io.in(data).clients((err , clients) => {
    logger.warn('There are ' + clients.length + ' connections in session: ' + data);
    
    if (clients.length > 0) {
        io.sockets.in(data).emit('closeOrder', data);
    }else {
        
        //No connections to this session, remove from the server
        logger.info(_.at(activeRooms[data], 'orgTitle') +' forcefully terminated ' + data + ' due to having no existing session connections');

        
        delete activeRooms[data];

    }

推荐阅读