Socket.io客户端向服务器端

时间:2017-11-05 16:29:55

标签: javascript socket.io

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

是的,我花了几周的时间讨论socket.io文档和相关的stackO问题,尝试了我的函数嵌套和一切,但我只是完全卡住了。

这应该允许人们进入一个房间。就某个问题投票。每个客户获得一票(是,不,或弃权)。问题是当有人投票时,它不能只添加一票就增加对套接字中人数的投票。例如,如果有三个人在一个房间,并且第一次投票是为了表示“是”。它注册3x' yea'票。我不能得到一个好计数!

客户端网站:



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

1 个答案:

答案 0 :(得分:0)

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

const voted = new Set;

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

if(voted.has(socket)) return;

voted.add(socket);

//vote

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