做了一款手机app,使用socket io作为长连接,在测试的时候发现,偶尔会出现连续的连接/断开的情况,我在控制台打印了消息如图所示,
测试的时候,有多个客户终端连接着,但是只有一个是这样,我的代码是如下:
const http = require('http');
let server = http.createServer(function (req,res){
res.writeHead(200,{'Content-Type':'text/html'});
res.end('connected','utf-8');
}).listen(ioConf.port,ioConf.host);
lightLog.info('pid',process.pid,'SocketIO Server running at',ioConf);
let io = require('socket.io').listen(server);
let sockets = [];//保存所有来自web端的连接
io.sockets.on('connection', function (socket) {//新的连接
// lightLog.info(socket);
let connectionKey = socket.handshake.address + ':' + socket.id;
lightLog.info('新入网:',connectionKey);
//
socket.on('new message',function(data) {//上来的数据是json格式
let obj = {};
let realData = JSON.parse(data);
let pushMessage = realData.group_name;
lightLog.info(pushMessage);
socket.emit(pushMessage,data);
socket.broadcast.emit(pushMessage,data);//收到什么就广播发送什么
// lightLog.info('收到:'+connectionKey+'的消息:'+data);
lightLog.info('收到:'+connectionKey+'的消息:'+data+'\r\n');
let result = realData.type;//用户操作类型
// lightLog.info(result);
try{
// require('../router/'+result+'.js').receive(
// data.userID,data.flag,data.type,data.Num,data.value1,data.value2);
}catch(err){
lightLog.error('pid: ',process.pid,' 转发出错:',' : \r\n ',err.stack);
}
// lightLog.info(data);
// 收到的消息存数据库
let sql = util.format('insert into %s (group_name,userID,login_name,message,time,type,user_name) ' +
' values("%s","%s","%s","%s","%s","%s","%s") ',chat_record,realData.group_name,realData.id,realData.login_name,
realData.message,realData.time,realData.type,realData.user_name);
lightLog.info(sql);
mysqlClient(sql,function(err,res) {
if(err) {
lightLog.error('pid:',process.pid,'出错 \r\n',err.stack);
}else{
lightLog.debug('pid:',process.pid,'结果',res);
}
});
});
//
// 用户登陆
socket.on('add user',function(data) {
lightLog.info('收到:'+connectionKey+'的消息:'+data+'\r\n');
// let realData = JSON.parse(data);
let objUser = {};
objUser.user_name = data;
objUser.time = moment().format("YYYY/MM/DD HH:mm:ss");
// 用户登陆后,广播登陆
lightLog.info(objUser);
socket.emit('user joined',objUser);
socket.broadcast.emit('user joined',objUser);
// 用户名与IP一一对应存redis
redisClient.sadd('userName',connectionKey,function(err,res) {
});
});
// lightLog.info('pid',process.pid,'新的连接加入:',connectionKey);
// 用户退出
socket.on('user exit', function (data) {//客户端消息事件
lightLog.info('pid',process.pid,'客户端:','发来消息',data);
socket.emit('user exit',);
socket.broadcast.emit('user exit',);
// 删除记录
redisClient.del('userName:'+connectionKey,function(err,res) {
});
});
// 用户掉线
socket.on('disconnect', function () {//客户端掉线事件
lightLog.info('pid',process.pid,'客户端:',connectionKey,'掉线');
let index = sockets.indexOf(socket);
// socket.emit('user out',objUser);
// socket.broadcast.emit('user out',objUser);
redisClient.srem('userName',connectionKey,function(err,res) {
});
});
});
希望哪位大神帮我看看是什么原因?如果测试问题出在什么地方的话,需要怎么做?