io.of()的动态聊天室

时间:2019-04-23 04:54:58

标签: sockets websocket socket.io

我正在使用socket.io创建聊天服务器。

当用户创建聊天室时

    socket.on('create', data => {
      room.to(mainPage).emit('message', data.roomId)
      require('./channals')(io, data.roomId)
      console.log(JSON.stringify(data) + 'room is created')
    })

找到有效,直到我尝试重新启动聊天服务器。

仅在创建房间时才发生仅保存在RAM中的房间的命名空间,因此,当我重新启动服务器并尝试加入房间时,会发生“无效的命名空间”错误。

所以当用户加入会议室时,我尝试了以下代码段。

    socket.on('joinChannal', data => {
      require('./channals')(io, data.roomId)
      console.log(`Joined in ${data.roomId} `)
    })

但是,每当用户加入会议室时,都会创建套接字。

我想做的是检查首次访问,如果第一次访问,然后创建新套接字,则不执行任何操作。

示例:

const rooms = new Set()
// ...
    socket.on('joinChannal', data => {
      if (rooms.has(data.roomId)) { // do nothing. }
      else { rooms.add(data.roomId); require('./channals')(io, data.roomId) }
    })
// ...

我在采取正确的方法吗?

这是我的代码。

module.exports = (io, roomId) => {
  const room = io.of(`/${roomId}`)
  const pageName = roomId

  room.on('connection', socket => {
    room.clients((err, clients) => {
      if (err) throw err
      console.log(clients)
    })

    socket.on('join', data => {
      socket.join(pageName)
    })

    // @params: data: {roomId: string, msg: string}
    socket.on('create', data => {
      room.to(pageName).emit('message', data)
    })

    socket.on('leave', () => {
      socket.leave(pageName)
    })

    socket.on('disconnect', () => {
      socket.disconnect(true)
    })

    socket.on('error', err => {
      console.log(err)
      socket.disconnect(true)
    })

    // @params: data: {roomId: string, userId: number}
    socket.on('joinToWrite', data => {
      room.to(pageName).emit('message', data)
    })
  })
}
module.exports = io => {
  const room = io.of('/mainpage')
  const mainPage = 'mainpage'
  let sockets = []

  room.on('connection', socket => {
    sockets.push(socket)

    socket.on('join', () => {
      socket.join(mainPage)
    })

    socket.on('create', data => {
      room.to(mainPage).emit('message', data.roomId)
      require('./channals')(io, data.roomId)
    })

    socket.on('joinChannal', data => {
      require('./channals')(io, data.roomId)
    })

    socket.on('leave', () => {
      sockets.splice(sockets.indexOf(socket), 1)
      socket.leave(mainPage)
    })

    socket.on('disconnect', () => {
      sockets.splice(sockets.indexOf(socket), 1)
      socket.leave(mainPage)
    })

    socket.on('error', err => {
      console.log(err)
    })
  })
}

如果需要更多信息,请告诉我。

谢谢。

0 个答案:

没有答案