websocket - 使用 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”,
解决方案
结束了以下。关键在于这里的答案: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];
}
推荐阅读
- node.js - Cron - 每年 1 月 1 日 00:00 或 12:00 am 运行一次
- xgboost - XGBRegressor 损失函数自定义
- mysql - 如何使用 SYSBENCH 测试 MySQL NDB 集群(NDB 存储引擎)的性能?
- arrays - 为什么我的反转数组功能不起作用?
- c# - 使用外部提供商登录时无法获得分配的用户角色
- java - Hazelcast:禁用集群
- python - PyQt5 将 QScrollArea 添加到 Frame 或 Widget
- c++ - C ++在构造函数中删除对象?
- typescript - Socket.IO NestJS 无法连接:不断断开/重新连接
- javascript - 第三次点击后隐藏按钮