Socket IO 服务器不向自定义房间发送消息

问题描述 投票:0回答:1

我正在构建一个大厅系统,玩家可以使用 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 = ''
    }
})

我可以向所有客户端发送全局消息,但无法针对特定房间。我知道我的客户在发送请求时加入了房间,但他们没有从房间收到任何消息。 我也不认为我的客户端会中途断开连接,因为它不会显示在我的断开连接日志中。

即使我不使用命名空间,我也尝试使用默认命名空间,首先,我都尝试让服务器和套接字发出消息,我已确保消息对象不是未定义的,并且我已确保房间名称是一个字符串,但到目前为止这些都不起作用。

服务器收到消息,但不会将其发送给其应该发送到的房间内的客户端。

javascript express websocket socket.io
1个回答
0
投票

我终于解决了这个问题。问题是我用我自己的替换了自动生成的套接字 ID。 删除后就可以了:

socket.leave(socket.id)
socket.id = user.id

我只需将客户端 ID 保存在其他地方即可。

© www.soinside.com 2019 - 2024. All rights reserved.