javascript - Socket.io-知道哪个房间的 socket 在哪

标签 javascript node.js sockets websocket socket.io

我正在使用node.js服务器在socket.io上编写一个简单的聊天。所以我需要知道在哪个房间的 socket 里。例如,套接字已连接并加入了一个房间。因此,当此套接字发送消息时,我只想将其广播到该房间中的套接字(sck.broadcast.to(it_room).emit)。

io.on("connection", function(sck) {
  ...
  sck.join(availableRoom);
  sck.on("message", function(msg) {
    sck.broadcast.to(**its room**).emit(msg);
    sck.emit(msg);
  });
  ...
});

我不需要一组套接字和有关它们的信息(在哪个房间等)。

最佳答案

您首先输入您的用户名和加入的聊天室。提交表单后,用户名和房间信息将作为查询字符串附加到URL后面。在浏览器中:location.search:这是我们查询字符串的方式。我们必须解析它。

将此CDN添加到您的main.html中

<script src="https://cdnjs.cloudflare.com/ajax/libs/qs/6.6.0/qs.min.js"></script>

该CDN用于npm querystringify软件包。由于在客户端设置npm软件包会很麻烦,因此cdn更易于处理。确保小时HTML中的CDN脚本文件应先加载,然后再加载其他js文件。加载此CDN之后,我们可以使用:
const { username, room } = Qs.parse(location.search, { ignoreQueryPrefix: true })

{ignoreQueryPrefix:true}此选项将省略“?”从查询字符串。

达到用户名和房间名称后,我们可以从客户端发出事件。

client.js
socket.emit('join', { username, room }, (error) => {
    if (error) {
        alert(error)
        location.href = '/' //will keep the client in the same url
    }
})

现在我们要从服务器端监听此事件。但是我们必须跟踪用户。

index.js
io.on("connection", socket => {

  socket.on("join", ({ username, room }, callback) => {
    //we have to define addUser function


let users = [];

const addUser = ({ id, username, room }) => {
  // Clean the data
  username = username.trim().toLowerCase();
  room = room.trim().toLowerCase();

  // Validate the data
  if (!username || !room) {
    return {
      error: "Username and room are required!"
    };
  }

  // Check for existing user
  const existingUser = users.find(user => {
    return user.room === room && user.username === username;
  });

  // Validate username
  if (existingUser) {
    return {
      error: "Username is in use!"
    };
  }

  // Store user
  const user = { id, username, room };
  users.push(user);
  // users=users.push(user) this will cause error
  return { user };
};
//as you see this function will return either error or user object

//Socket generates an id upon connection.
//result is either error or user
    const { error, user } = addUser({ id: socket.id, username, room });

    if (error) {
      return callback(error);
    }

    socket.join(user.room);//socket joined to this room
    //now time to emit a new event
    socket.emit("message", ( "Welcome!"));
    socket.broadcast
      .to(user.room)
      .emit(
        "message",
        (`${user.username} has joined!`)
      );


//broadcast will send messages to everyone in the chat room except the connected socket

    callback(); //success scenario. let the client knows that it is allowed to connect
  })   
})

关于javascript - Socket.io-知道哪个房间的 socket 在哪,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36580435/

相关文章:

javascript - 使用node.js进行客户端服务器通信

iphone - 如何确定无效的 CFSocket

javascript - 如何在 JSDoc 中创建类别?

javascript - 如何从字符串中剪切第三个符号并在没有第三个符号的情况下发出警报

javascript - Vue.js Switch 语句未分配变量

Node.js 将 HTML 作为响应发送给客户端

javascript - 对同一路径使用 app.post() 和 app.put()

sockets - 将我的头缠在Socket.io Client API上

python - 关于 pymatbridge

javascript - 如何在 bootstrap collapse 插件上禁用 bootstrap 默认行为