javascript - 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);```
解决方案
推荐阅读
- haskell - 从映射到其关联对的光学
- json - Spring Boot:防止 Jackson 在 JSON 序列化时“重新格式化”XMLGregorianCalendar
- sql-server - 带有 Invoke-Webrequest SQL 和 Powershell 的顽固 & 符号
- docker - 在 Dockerfile 中暴露端口
- python - 无法在python中序列化列表
- reactjs - 未捕获的错误:重新渲染过多。React 限制了渲染的数量以防止无限循环。React Hooks,承诺
- sql - SQL Inner 连接两个表并根据条件从第二列中提取一个布尔值
- altair - 选择数据会切断 Altair 图中的标签
- docker - 如何在 yml 配置文件中替换字符串中的单词
- excel - 有没有办法将值与查找表中的范围匹配?