socket io 不稳定问题

做了一款手机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) {

    });
    
});

});

希望哪位大神帮我看看是什么原因?如果测试问题出在什么地方的话,需要怎么做?

阅读 3.1k
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题