qq_36099238 2018-05-09 14:49 采纳率: 0%
浏览 812
已结题

为什么每次用户退出登录后再登录,on收到的消息会增多,退出多少次on收到的消息会增加几次

  1. server端
var http = require('http')
var express = require('express')
var app = express()
var server = http.Server(app)
var path = require('path')
var bodyParser = require('body-parser')
var session = require('express-session')
var userApi = require('./api/userApi')
var db = require('./db').mysql
var mysql = require('mysql')
var $sql = require('./sqlmap')

var pool = mysql.createPool(db)

app.use(express.static(path.join(__dirname, '../static')))
app.use(bodyParser.json())
app.use(session({
  secret: ' secret chat hpq', // 对session id 相关的cookie 进行签名
  resave: false,
  saveUninitialized: false, // 是否保存未初始化的会话
  cookie: {
    maxAge: 1000 * 60 * 60 // 设置 session 的有效时间,单位毫秒
  }
}))

app.use('/api/user', userApi)

server.listen(3000, function () {
  console.log('the server is running at port 3000')
})

var io = require('socket.io')(server)
var usocket = {}
var friends = []
var addFriendMsg = {}
var addMsgs = []
var agreeFriendMsg = {}
var agreeMsgs = []
var disagreeFriendMsg = {}
var disagreeMsgs = []
var cleanSocketTimer = null
io.on('connection', (socket) => {
  console.log('客户端连接成功')
  socket.on('new join', (telephone) => {
     cleanSocketTimer = setTimeout(() => {
       if (telephone in usocket) {
         delete usocket[telephone]
       }
       clearTimeout(cleanSocketTimer)
     }, 1000 * 60 * 60.1)
     console.log(telephone + '用户发起聊天')
     if (telephone in usocket) {
       delete usocket[telephone]
     }
     socket.telephone = telephone
     usocket[telephone] = socket
     pool.getConnection((err, conn) => {
       var sql = $sql.user.getOnlineFriends
       conn.query(sql, telephone, (err, result) => {
         if (err) {
           throw err
         }
         friends = result
         for (var i = 0; i < friends.length; i++) {
             usocket[friends[i].telephone].emit('login')
         }
         conn.release()
       })
     })
     if (telephone in addFriendMsg) {
       for (var i = 0; i < addFriendMsg[telephone].length; i++) {
         usocket[telephone].emit('receive addfriend', addFriendMsg[telephone][i])
       }
       addFriendMsg[telephone] = []
     }
     if (telephone in agreeFriendMsg) {
       for (var j = 0; j < agreeFriendMsg[telephone].length; j++) {
         usocket[telephone].emit('agree your addfriend', agreeFriendMsg[telephone][j])
       }
       agreeFriendMsg[telephone] = []
     }
    if (telephone in disagreeFriendMsg) {
      for (var k = 0; k < disagreeFriendMsg[telephone].length; k++) {
        usocket[telephone].emit('disagree your addfriend', disagreeFriendMsg[telephone][k])
      }
      disagreeFriendMsg[telephone] = []
    }
  })
  socket.on('user left', (telephone) => {
    console.log('用户退出')
    if (cleanSocketTimer) {
      clearTimeout(cleanSocketTimer)
    }
    if (telephone in usocket) {
      delete usocket[telephone]
    }
    pool.getConnection((err, conn) => {
      var sql = $sql.user.getOnlineFriends
      conn.query(sql, telephone, (err, result) => {
        if (err) {
          throw err
        }
        friends = result
        for (var i = 0; i < friends.length; i++) {
          if (friends[i].telephone in usocket) {
            usocket[friends[i].telephone].emit('logout')
          }
        }
        conn.release()
      })
    })
  })
  socket.on('send private msg', (msg, toUser, fromUser) => {
     console.log('收到客户端发来的信息')
     pool.getConnection((err, conn) => {
       var telTail1 = fromUser.substr(7)
       var sql1 = 'insert into ch' + telTail1 +
         '(fromUser, toUser, content, sendTime) values(?,?,?,?)'
       var sendTime = new Date()
       conn.query(sql1, [fromUser, toUser, msg, sendTime], (err, result) => {
         if (err) {
           throw err
         }
         if (result.affectedRows > 0) {
           if (fromUser in usocket) {
             console.log('向发送的客户端发送消息')
             usocket[fromUser].emit('u send private msg', {msg: msg, toUser: toUser, sendTime: sendTime})
           }
           var telTail2 = toUser.substr(7)
           var sql2 = 'insert into ch' + telTail2 +
             '(fromUser, toUser, content, sendTime) values(?,?,?,?)'
           conn.query(sql2, [fromUser, toUser, msg, sendTime], (err, result) => {
             if (err) {
               throw err
             }
             if (result.affectedRows > 0) {
               if (toUser in usocket) {
                 console.log('向接收的客户端发送消息')
                 usocket[toUser].emit('u receive private msg', {msg: msg, fromUser: fromUser, sendTime: sendTime})
               }
             }
           })
         }
         conn.release()
       })
     })
  })
  socket.on('addfriend', (toUser, fromUser, fromUserName, sendTime) => {
     console.log('收到客户端发来的好友邀请')
     if (toUser in usocket) {
       console.log('向客户端发送好友邀请')
       usocket[toUser].emit('receive addfriend', {fromUser: fromUser, fromUserName: fromUserName, sendTime: sendTime})
     } else {
       var addMsg = {
         toUser: toUser,
         fromUser: fromUser,
         fromUserName: fromUserName,
         sendTime: sendTime
       }
       addMsgs.push(addMsg)
       addFriendMsg[toUser] = addMsgs
     }
  })

  socket.on('agree addfriend', (fromUser, agreeUser, agreeUserName, sendTime) => {
    console.log('收到客户端同意了好友邀请')
    if (fromUser in usocket) {
      console.log('向客户端发送好友邀请已通过')
      usocket[fromUser].emit('agree your addfriend', {fromUser: fromUser, agreeUser: agreeUser, agreeUserName: agreeUserName, sendTime: sendTime})
    } else {
      var agreeMsg = {
        fromUser: fromUser,
        agreeUser: agreeUser,
        agreeUserName: agreeUserName,
        sendTime: sendTime
      }
      agreeMsgs.push(agreeMsg)
      agreeFriendMsg[fromUser] = agreeMsgs
    }
  })
  socket.on('disagree addfriend', (fromUser, disagreeUser, disagreeUserName, sendTime) => {
    console.log('收到客户端不同意好友邀请')
    if (fromUser in usocket) {
      console.log('向客户端发送好友邀请没有通过')
      usocket[fromUser].emit('disagree your addfriend', {fromUser: fromUser, disagreeUser: disagreeUser, disagreeUserName: disagreeUserName, sendTime: sendTime})
    } else {
      var disagreeMsg = {
        fromUser: fromUser,
        disagreeUser: disagreeUser,
        disagreeUserName: disagreeUserName,
        sendTime: sendTime
      }
      disagreeMsgs.push(disagreeMsg)
      disagreeFriendMsg[fromUser] = disagreeMsgs
    }
  })
  socket.on('init friendlist', (agreeUser) => {
    console.log('初始化对方的好友列表')
    if (agreeUser in usocket) {
      console.log('初始化好友列表')
      usocket[agreeUser].emit('let u init friendlist')
    }
  })
  socket.on('disconnect', () => {
     console.log('客户端断开连接')
     if (socket.telephone in usocket) {
       delete usocket[socket.telephone]
     }
  })
})

用户退出登录会emit‘user left’事件到server,再重新登录上去,前端socket.on收到别人发来的消息数目就会增加,退出几次,收到的消息会多几次,这是为什么?是因为退出登录后再登录io连接增加了吗?要怎么改

  1. client端
  socket.on('u receive private msg', (msgObj) => {
      console.log(`${msgObj.fromUser}在${msgObj.sendTime}发来了信息:${msgObj.msg}`)
    })
    socket.on('u send private msg', (msgObj) => {
      console.log(`你在${msgObj.sendTime}向${msgObj.toUser}发去了信息:${msgObj.msg}`)
    })
  • 写回答

2条回答 默认 最新

  • 默默悟问 2018-05-10 01:35
    关注

    看console.log('收到客户端发来的信息')和console.log('向接收的客户端发送消息')输出了多少次,可能是因为客户端退出登录多次,
    但是socket还连接着server,发一次消息,实际服务端收到多次,每退出登录多一次。

    评论

报告相同问题?

悬赏问题

  • ¥15 #MATLAB仿真#车辆换道路径规划
  • ¥15 java 操作 elasticsearch 8.1 实现 索引的重建
  • ¥15 数据可视化Python
  • ¥15 要给毕业设计添加扫码登录的功能!!有偿
  • ¥15 kafka 分区副本增加会导致消息丢失或者不可用吗?
  • ¥15 微信公众号自制会员卡没有收款渠道啊
  • ¥100 Jenkins自动化部署—悬赏100元
  • ¥15 关于#python#的问题:求帮写python代码
  • ¥20 MATLAB画图图形出现上下震荡的线条
  • ¥15 关于#windows#的问题:怎么用WIN 11系统的电脑 克隆WIN NT3.51-4.0系统的硬盘