利用socket.io监听访问量
发布于 11 年前 作者 sdfcbs91 5941 次浏览 最后一次编辑是 8 年前

这两天利用socket.io写了一个简易的网页流量监听(express+mongodb):

数据集 var Clicks = db.model(‘click’,new Schema({ intime:{type:Date,default:Date.now} //进入时间 ,referrer:String //上一步url = 入口 ,outtime:{type:Date,default:Date.now} //退出时间 ,address:String //ip地址 ,user:String //暂时用ip地址代替 })); status文件(设置mongoose连接mongodb):

var collection = “blog”; var mongoose = require(‘mongoose’); //mongoose.connect(‘mongodb://localhost/blog’); var db = mongoose.createConnection(‘mongodb://localhost/’+collection);

module.exports = { mongoose:mongoose ,db:db };

后台操作数据库采用的是mongoose操作mongodb

var status = require(’./…/status’); var mongoose = status.mongoose; var db = status.db; var Schema = mongoose.Schema; var Clicks…//数据集模型 var User = function(){}

User.prototype.intoclick=function(referrer,dd){ //用户链接成功后 //var ip = req.connection.remoteAddress; var d = Date(); var click = new Clicks ({intime:d,outtime:d,referrer:referrer,address:dd.ip,user:dd.ip}); click.save(function(err){ //var re = false; if(err){ console.log(err); return false; }else{

  Clicks.find({ intime: d}, function (err, docs) {
    if(err){
      console.log(err);
      return false;
    }else{
      dd._id =docs[0]._id;
    }
  });
  
}

}); }

User.prototype.outclick=function(dd){ //用户断开连接 var d = Date(); var click = new Clicks ({outtime:d}); console.log(dd._id); Clicks.update({_id:dd._id},{$set:{outtime:d}} ,function(err){ if(err){ console.log(err); }else{ console.log(dd._id); } }); }

socket.io监听: var User = require("./…/moudels/user.js"); module.exports = function(io,app){ //app为express的get post用 io.sockets.on(‘connection’, function (socket) { var dd = {ip:socket.handshake.address.address,_id:0}; socket.on(‘intoclick’, function (data) { User.intoclick(data.referrer,dd); }); socket.on(‘disconnect’, function (socket) { User.outclick(dd); }); }); }

前端: window.onload=function(){ var socket = io.connect(‘http://localhost’); socket.emit(‘intoclick’, { referrer:document.referrer||"" }); }

12 回复

利用socket.io监听用户访问时间吗?

有了登入和登出 两个时间,访问时间就有了呀 intime,outtime

@wswsws1200 express也可以的,客户端的 onload以及unnoload …

@sdfcbs91 好像是unonload

@sdfcbs91 express组件可以吗?如果我直接关闭页面,或者强制关闭浏览器进程。不通过心跳包怎么实现下线监听呢?不太能理解

@wswsws1200 关闭浏览器或者跳转其他页面,是不是前端JS都可以监听到?用户离开此页面,前端JS做一个AJAX就可以的,相当于socket的disconnet监听

@wswsws1200 弱弱问一句,心跳包是什么?

@sdfcbs91 关闭浏览器js能监听到?这个我不太清楚。强行关闭的话有时间执行那些js代码吗?

@ggaaooppeenngg 保持长连接用的,可以设置,socket.io默认的应该是25,让不断和进行非常微量的通信,让服务器知道这个连接还在保持。不然你觉得为什么你能监听disconnect和reconnect呢

@wswsws1200 这个牵扯到客户端js里面的另两个模块,DOM和BOM,DOM会监听到的,在执行玩JS之后再关闭, 最近忙其他的去了,没有登录Cnode

回到顶部