Socket.io - 知道哪个房间插座

时间:2016-04-12 17:42:02

标签: javascript node.js sockets websocket socket.io

我正在使用nodejs服务器在socket.io上写一个简单的聊天...所以我需要知道哪个房间插座是。例如,套接字已连接,服务器将其扔到某个房间。因此,当这个套接字发送消息时,我需要将它广播到this.socket会议室的所有套接字(sck.broadcast.to(it_room).emit)。

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

我不需要套接字数组和有关它们的信息(在哪个房间等)。 抱歉我的英文不好

2 个答案:

答案 0 :(得分:0)

尝试使用以下内容,但我不确定它是否适用于所有情况。

Object.keys(sck.manager.roomClients[sck.id])[1]

我通过记录套接字找到了这个,然后我查找房间信息并以我在代码中看到的方式提取它。

我使用的是0.9.6 socket.io版本,也许最新版本有不同的解决方案。

答案 1 :(得分:0)

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

将此CDN添加到您的main.html

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

此CDN for 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
  })   
})