gre*_*reW 12 javascript node.js socket.io
我正在尝试使用socket.io版本构建一些基本的聊天(基于房间):
"socket.io": "^2.1.1"
"socket.io-client": "^2.1.1"
Run Code Online (Sandbox Code Playgroud)
我有几个基本问题,无论我找到多深,我都找不到任何有效的答案.
当一个用户进入一个特定的房间时,我正在这样做(在服务器中),
socket.join(roomName)所以只有当至少有连接到这个房间的插座时,房间才"存在"?
我想创建一个屏幕,其中包含房间名称和参与者的数量 - (是否可以通过客户端socketIO的对象获取它?),我发现可以通过使用获取房间名称(服务器端)io.sockets.adapter.rooms但是我得到了非常奇怪的字符串,绝对不是房间名称.
我正在尝试在每个房间内创建一个页面,显示连接到该房间的用户(进入房间的连接socket.join(roomName))
我是socket.io的新手.我希望有人可以帮助我更好地理解如何使用它,以及我在这里缺少的东西.
谢谢!
Bal*_*zar 10
实际上,只要有一个客户端连接到socket.io房间,它就会存在.此外,它被销毁,以便在最后一个客户端离开它时释放内存,如此处所示在套接字适配器中:
if (this.rooms[room].length === 0) delete this.rooms[room];
Run Code Online (Sandbox Code Playgroud)
要获得真实的房间名称,您必须在服务器端跟踪它们.最简单的方法是用房间名称索引的用户计数对象.
const usersByRooms = {}
Run Code Online (Sandbox Code Playgroud)
当新套接字连接时,您将首先发送此完整对象
socket.emit('getAllRooms' usersByRoom)
Run Code Online (Sandbox Code Playgroud)
当你在客户端上收到它时,用它的键迭代这个对象
socket.on('getAllRooms', (usersByRoom) => {
Object.keys(usersByRoom).forEach(roomName =>
console.log(roomName, usersByRoom[roomName]))
})
Run Code Online (Sandbox Code Playgroud)
我假设您的页面需要连接到您的房间的客户端数量更新.为此,您需要有一种方法来广播房间的用户数量(如果要更改),并相应地更新usersByRooms缓存,如下所示:
const updateCount = roomName => {
const userCount = io.sockets.clients(roomName).length
// we do not update if the count did not change
if (userCount === usersByRoom[roomName]) { return }
usersByRoom[roomName] = userCount
io.emit('updateCount', { roomName, userCount })
}
Run Code Online (Sandbox Code Playgroud)
每次socket连接时都需要调用此方法,并使用这两种方法的回调成功离开房间:
socket.join(roomName, () => {
updateCount(roomName)
})
socket.leave(roomName, () => {
updateCount(roomName)
})
Run Code Online (Sandbox Code Playgroud)
您现在可以挂钩socket.io#2332中disconnecting添加的新事件,以防您的客户端断开连接或只是关闭您的应用程序以将新计数广播到套接字所连接的任何房间.
socket.on('disconnecting', () => {
const rooms = socket.rooms.slice()
// ...
})
Run Code Online (Sandbox Code Playgroud)
这种方法可能有点棘手,因为您需要跟踪被断开的套接字的房间,并在套接字完成断开连接后立即更新它们.
一个更简单的方法是在每个套接字断开后立即迭代所有房间并调用updateCount,因为该方法仅在房间的用户数改变时广播事件,所以应该没问题,因为你有数千个房间.
socket.on('disconnected', () => {
Object.keys(usersByRooms).forEach(updateCount)
})
Run Code Online (Sandbox Code Playgroud)
请注意,如果您使用套接字群集,它会有点棘手,但我假设设置正常.
| 归档时间: |
|
| 查看次数: |
1350 次 |
| 最近记录: |