【问题标题】:Why is Socket.IO adding two clients when only one is connecting?为什么只有一个客户端连接时,Socket.IO 会添加两个客户端?
【发布时间】:2019-07-09 07:02:17
【问题描述】:

在我的应用中,用户进入主屏幕,选择他们的用户名,然后导航到另一个页面,他们可以从该页面进入进入房间的页面。

我有一些代码,每次用户加入房间时都会增加一个变量clients。但是,每当有新用户加入时,clients 就会增加已连接用户的数量。这不是期望的行为。我的代码如下:

app.post('/race', function(req,res) {
  let race = io.of('/race').on('connection', (socket) => {
    console.log('A user has entered the race!');
    socket.on('joinRoom', function(roomName) {
      socket.room = roomName;
      console.log(socket.room);

      clients++;
      console.log(clients);
    });

    socket.on('disconnect', function() {
      clients--;
      console.log("A user has disconnected");
      console.log(clients);
    });
  });

  res.sendFile(path.join(__dirname, '/client/race/index.html'));
});

为简洁起见,我从代码中删除了一些函数。但是将用户添加到clients 的主要功能仍然存在。当只有一个用户连接和断开时,它可以正常工作,但是当另一个用户加入时,它会加 2,使总数达到 3。当第三个用户加入时,它会增加 3,使总数达到 6。

socket.on('joinRoom 函数一定有问题 - 它似乎被称为连接用户的次数。请注意,console.log('A user has entered the race!'); 不会被调用两次。

为什么会出现这个问题?

【问题讨论】:

    标签: javascript html node.js express socket.io


    【解决方案1】:
    //Server
    app.get('/race', function(req, res) {
      res.sendFile(path.join(__dirname, '/client/race/index.html'));
    });  
    
    const racesocket = io('http://localhost', {
      path: '/race'
    });
    
    racesocket.on('connection', (socket) => {
        console.log('A user has entered the race!');
        socket.on('joinRoom', function(roomName) {
          socket.room = roomName;
          console.log(socket.room);
    
          clients++;
          console.log(clients);
        });
    
        socket.on('disconnect', function() {
          clients--;
          console.log("A user has disconnected");
          console.log(clients);
        });
      });
    
    
    //Client
    <script src="/socket.io/socket.io.js"></script>
    <script>
      const socket = io('http://localhost/race');
    </script>
    

    每次用户执行“/race” POST api 时都会调用整段代码。这不是必需的,从那里删除它,一旦客户端连接到socket中的“/race”,它会自动进入'onconnection'回调。

    所以看起来你有用户多次连接事件回调,而不是只有一次。

    【讨论】:

    • 所以我应该将除res.sendFile 之外的所有内容移出函数吗?我有点困惑。
    • 现在添加完整代码,正如我所说,想法是单独连接到套接字并等待服务器中的连接
    猜你喜欢
    • 2021-01-05
    • 2017-08-07
    • 1970-01-01
    • 2015-10-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-02
    相关资源
    最近更新 更多