首页 > 解决方案 > Socket.io 在连接时连接两次

问题描述

所以,我有一个故障项目。如您所见,有一个对象跟踪玩家,还有一个对象跟踪套接字。有时,当有人连接到我的故障项目时,代码会说它连接了两次。该对象有两个新玩家。我不明白为什么会发生这种情况,或者为什么有时只会发生这种情况。作为第二个连接的幽灵客户端在一段时间后离开,并像普通玩家离开一样说“没有名字留下”的消息。

这是服务器代码:

var app = express();
var server = require('http').createServer(app);
require('dotenv').config();
var CronJob = require('cron').CronJob;
var job = new CronJob('* * * * * *', function() {
  
}, null, true, 'America/Los_Angeles');
job.start();
//server
const exec = require('child_process').exec;
//const testscript = exec('mkdir yes');

//testscript.stdout.on('data', function(data){
//    console.log(data);
//    // sendBackInfo();
//});
var ip;
app.get('/',function(req, res) {
res.sendFile(__dirname + '/client/chat.html');
  const IP = req.headers["x-forwarded-for"].split(",")[0];
  ip = IP;
});
console.log(ip); // logs the ip in server console
app.get('/test',function(req, res) {
res.sendFile(__dirname + '/client.html');
})
app.get('/client',function(req, res) {
res.sendFile(__dirname + '/client.html');
})
app.get('/kicked',function(req, res) {
res.sendFile(__dirname + '/client/kick.html')
})
app.get('/secret',function(req, res) {
res.sendFile(__dirname + '/client/secret.html')
})
app.get('/theduelofthecentury',function(req, res){
res.sendFile(__dirname + '/dreamvtechno.html')
})
app.get('/client/style.css',function(req, res){
res.sendFile(__dirname + '/client/style.css')
})
app.get('/internetscamtest',function(req, res){
res.sendFile(__dirname + '/client/internetscamtest.html')
})
app.get('*',function(req, res){
res.sendFile(__dirname + '/client.html')
})
app.use('/client',express.static(__dirname + '/client'));
//players and sockets
var SOCKET_LIST = {};
var players = {};
var io = require('socket.io')(server);
io.sockets.on('connection', function(socket){
    console.log(socket.handshake.headers['x-forwarded-for'].split(",")[0]);
    var socketId = Math.random();
    SOCKET_LIST[socketId] = socket;
    players[socketId] = {name:"no name", id:socketId, op:false, ad:false, ip:socket.handshake.headers['x-forwarded-for'].split(",")[0]};
    //console.log(players);
    socket.emit('setPlayerId', socketId);
    socket.emit('update', players);
    for(var i in SOCKET_LIST){
        SOCKET_LIST[i].emit('joined', players[socketId]);
    }
    for(var i in players){
      if(players[i].ip = socket.handshake.headers['x-forwarded-for'].split(",")[0] && i != socketId){
        socket.emit('iptaken', null);
      }
    }
  socket.emit('pass', process.env.PASSWORD);
    socket.on('msg', function(data){
        players[data.id].name = data.name;
        for(var i in SOCKET_LIST){
        SOCKET_LIST[i].emit('sentMsg', {msg:data.msg, name:data.name, id:data.id});
        }
        console.log(data.name + " said " + data.msg);
    })
    //commands
    socket.on('kick', function(data){
      console.log(data.reason);
        for(var i in SOCKET_LIST){
          if(data.reason != null && data.reason != undefined && data.reason != "" && data.reason != process.env.PASSWORD){
        SOCKET_LIST[i].emit('left', {id:data.id, reason:" was kicked by "+data.name+" for "+data.reason});
          } else if(data.reason == null || data.reason == undefined || data.reason == "") {
            SOCKET_LIST[i].emit('left', {id:data.id, reason:" was kicked by "+data.name+"."});
          } else if(data.reason == process.env.PASSWORD){
            SOCKET_LIST[i].emit('left', {id:data.id, reason:" was rick rolled."});
          }
        }
        SOCKET_LIST[data.id].emit('kicked', data.reason);
        SOCKET_LIST[data.id].disconnect();
        delete players[data.id];
        delete SOCKET_LIST[data.id];
    });
    socket.on('clear', function(data){
        for(var i in SOCKET_LIST){
        SOCKET_LIST[i].emit('clear', null);
        }
        
    });
    socket.on('op', function(data){
        players[data.id].op = true;
        for(var i in SOCKET_LIST){
            SOCKET_LIST[i].emit('opped', data);
        }
        console.log("user "+data.name+" was opped");
    });
    socket.on('unop', function(data){
        players[data.id].op = false;
        for(var i in SOCKET_LIST){
          SOCKET_LIST[i].emit('unopped', data);
        }
    })
    socket.on('whisper', function(data){
        for(var i in SOCKET_LIST){
            SOCKET_LIST[i].emit('whispered', data);
        }
        console.log(data.name);
    });
    socket.on('disconnect',function(reason){
        delete SOCKET_LIST[socketId];
        delete players[socketId];
        for(var i in SOCKET_LIST){
        SOCKET_LIST[i].emit('left', {id:socketId, reason:" left"});
        }
    });
});
server.listen(3000);```

标签: javascriptnode.jssocket.io

解决方案


推荐阅读