我正在构建一个大厅系统,玩家可以使用 Socket io 版本 4 互相邀请。目前,它的工作原理是客户端发送一个简单的请求来创建一个房间,然后加入它。之后,客户端应该能够向房间中的其他客户端发送消息。问题是服务器收到消息但从未将其转发给房间中的任何客户端。
目前,我的代码如下所示
服务器
io.on('connection', (socket) => {
const token = extractToken(socket.handshake.headers)
const decodedToken = jwt.decode(token, { complete: true })
const user = decodedToken.payload.user_information
socket.leave(socket.id)
socket.id = user.id
socket.join(socket.id)
socket.on('room', (room) => {
socket.join(room)
})
socket.on('lobby', async (data) => {
const { message, room } = data
console.log(data)
socket.to(room).emit('lobby', message)
})
socket.on('disconnect', () => {
console.log(user.username + ' has disconnected')
})
})
客户
const connect = () => {
socket = io('localhost:8080', {
extraHeaders: {
authorization: 'bearer ' + token
}
})
socket.on('lobby', (msg) => {
console.log(msg)
const item = document.createElement('li')
item.textContent = msg
messagesList.appendChild(item)
})
}
messageForm.addEventListener('submit', async (e) => {
e.preventDefault()
if (messageInput.value) {
await socket.emit('room', roomInput.value)
socket.emit('lobby', { 'message': messageInput.value, 'room': roomInput.value })
messageInput.value = ''
}
})
我可以向所有客户端发送全局消息,但无法针对特定房间。我知道我的客户在发送请求时加入了房间,但他们没有从房间收到任何消息。 我也不认为我的客户端会中途断开连接,因为它不会显示在我的断开连接日志中。
即使我不使用命名空间,我也尝试使用默认命名空间,首先,我都尝试让服务器和套接字发出消息,我已确保消息对象不是未定义的,并且我已确保房间名称是一个字符串,但到目前为止这些都不起作用。
服务器收到消息,但不会将其发送给其应该发送到的房间内的客户端。
我终于解决了这个问题。问题是我用我自己的替换了自动生成的套接字 ID。 删除后就可以了:
socket.leave(socket.id)
socket.id = user.id
我只需将客户端 ID 保存在其他地方即可。