【问题标题】:Socket.io client side emits too many times to server sideSocket.io 客户端向服务器端发出太多次
【发布时间】:2017-11-06 01:04:59
【问题描述】:

请帮我弄清楚为什么我的 socket.io 应用会触发太多的发出消息。

是的,我花了数周时间研究 socket.io 文档和相关的 stackO 问题,试验了我的函数和所有内容的嵌套,但我完全陷入了困境。

这应该允许“房间”中的人们对某个问题进行投票。每个客户获得一票(是、否或弃权)。问题是当有人投票时,它不能只添加一票,它会添加对套接字中人数的投票。例如,如果三个人在一个房间里,并且第一票投给“是”,则它会记录 3 次“是”票。我永远数不清!

客户网站:

var socket = io.connect('http://localhost');
const url      = window.location.href; 
let voteName = url.substring(url.lastIndexOf("/") + 1);
let notVoted = true;

$('.voteName').html(voteName.replace(/_/g, ' '));

function getRoom(){
   return voteName;
}

socket.on('connect', () => {
   // Connected, let's sign-up for to receive messages for this room
 
   socket.emit('room', getRoom());
   console.dir(socket.id);
});

function yea () {
    if(notVoted){
        socket.emit('yea',voteName);
        console.log(voteName)
        notVoted = false;
    }
}

function nay () {
    if(notVoted){
        io.emit('nay',voteName);
        notVoted = false;
    }
}

function abs () {
    if(notVoted){
        io.emit('abs',voteName);
        notVoted = false;
    }
}

服务器端:

app.post('/votePick', (req, res) => { 
    let voteName = req.body.votePick;
    res.send(voteName);

    app.get('/'+voteName,(req,res)=>{
        res.sendFile(__dirname + '/canvas.html');
    });
    
    var nsp = io.of('/');


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

        socket.on('room', (voteName) => {

            //TODO check if room exists
            socket.join(voteName);

            if(!db[voteName]) {
                db[voteName]={'yea':0,'nay':0,'abs':0,'cnctCount':1};
                io.emit('update',db[voteName]);
           
            } else {
                io.emit('update',db[voteName]);
            }
        }); 

        socket.on('yea', (voteName)=>{
            db[voteName].yea++;
            io.emit('update',db[voteName]);
            console.log(db[voteName].cnctCount);
        });
        
        socket.on('nay', (voteName)=>{
            db[voteName].nay++;
            io.emit('update',db[voteName]);   
            console.log(db[voteName]);
        });
        
        socket.on('abs', (voteName)=>{
            db[voteName].abs++;
            io.emit('update',db[voteName]);   
            console.log(db[voteName]);
        });
    });
});

我的完整仓库在这里: https://github.com/Bokeefe/sockerPractice

【问题讨论】:

  • 应该socket.emit('room', getRoom());socket.emit('room', getRoom);
  • 那只是返回房间名称,从URL中抓取,需要运行函数获取相关房间。

标签: javascript socket.io


【解决方案1】:

您应该进行用户验证。没有人可以阻止更改客户端的代码,因此您始终需要检查服务器端。例如,您可以存储已经投票的套接字 id:

const voted = new Set;

然后在套接字事件处理程序中:

if(voted.has(socket)) return;

voted.add(socket);

//vote

这也应该解决票数两次的问题。

【讨论】:

  • 谢谢!我需要再多解释一下才能完全理解。我在文档中并没有真正遇到过这样的验证,但它确实有效。
猜你喜欢
  • 2019-07-04
  • 2019-03-15
  • 1970-01-01
  • 2019-01-18
  • 1970-01-01
  • 2018-10-19
  • 2013-09-09
  • 2019-04-23
  • 1970-01-01
相关资源
最近更新 更多