这两天利用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||"" }); }
利用socket.io监听用户访问时间吗?
有了登入和登出 两个时间,访问时间就有了呀 intime,outtime
@sdfcbs91我感觉也是,否则这个也不需要用到socket.io,总感觉大材小用了
@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 受教。
@wswsws1200 这个牵扯到客户端js里面的另两个模块,DOM和BOM,DOM会监听到的,在执行玩JS之后再关闭, 最近忙其他的去了,没有登录Cnode