100行js代码实现网站在线用户数量统计 nodejs + socket.io方案[亲测有效]

100行js代码实现网站在线用户数量统计 nodejs + socket.io方案[亲测有效]  公司的在线培训平台,需要增加一个新功能:实时统计当前在线的用户数量并在终端界面上显示,需要的时候可以查询当前在线的用户的明细。   有3种技术方案可以选用:   1)改动后台代码,在用户登录和退…

100行js代码实现网站在线用户数量统计 nodejs + socket.io方案

  公司的在线培训平台,需要增加一个新功能:实时统计当前在线的用户数量并在终端界面上显示,需要的时候可以查询当前在线的用户的明细。

  有3种技术方案可以选用:

  1)改动后台代码,在用户登录和退出时将用户在线信息记录到数据库中,通过查询数据库查询用户明细。这种方案稍微重了点,要改动原来后台的代码,这个功能的加入需要重新进行后台代码的更新和测试。总觉得不妥,实时性和准确性也难以保障。

  2)使用消息队列(message queue),将用户登录和退出的消息实时分发给一个独立的记录器模块,由记录器进行在线用户的记录和保存。这种方案依赖消息队列消息传递的准确性和及时性。

  3)采用socket.io技术,建立一个独立的微服务,进行在线用户的记录。socket.io具有轻量、易维护的特点,客户端具有自动重连机制,可以保障数据的准确性和及时性。

  权衡后决定采用第3种方案。

  技术方案

  nodejs + socket.io

  nodejs是后台运行环境,使用socket.io模块进行在线用户的记录和通信。

  服务器端

  代码

  主程序代码 app.js

  复制

  var express = require(“express”);

  var app = express();

  var http = require(“http”);

  var server = http.createServer(app);

  var io = require(“socket.io”);

  var ios = io.listen(server);

  var port = 86;

  server.listen(port);

  console.log(“start server on port: ” + port);

  //辅助函数,根据room名称获取room对象

  function ioRoom(name){

  return ios.nsps[“/”].adapter.rooms[name];

  }

  //socket.io handling

  ios.on(“connection”, function(socket){

  console.log(“new client connected…”);

  socket.on(“user”, function(roomName,data, callback){

  if(!data) data= {};

  socket.join(roomName);

  console.log(“new user jioned ” + roomName );

  //保存用户数据

  let room = ioRoom(roomName);

  if(!room.users){

  room.users = {};

  }

  socket.room = roomName;

  var ip = socket.handshake.address;

  if(socket.handshake.headers[“x-forwarded-for”] != null){

  ip = socket.handshake.headers[“x-forwarded-for”];

  }

  data.socket_id = socket.id;

  data.client_ip = ip;

  data.addtime = (new Date()).getTime() / 1000;

  room.users[socket.id] = data;

  var count = Object.keys(room.users).length;

  var backdata = {user_num:count,room:roomName};

  if(typeof callback === “function”){

  callback(backdata);

  }

  //发送用户数给所有人

  ios.to(socket.room).emit(“online-number”, backdata);

  });

  //根据用户请求发送用户列表给客户端

  socket.on(“get-users”, function(callback){

  if(!socket.room){

  console.log(“user not jioned a room!”);

  return;

  }

  let room = ioRoom(socket.room);

  callback(room.users);

  });

  // disconnect user handling

  socket.on(“disconnect”, function () {

  if(!socket.room){

  return;

  }

  let room = ioRoom(socket.room);

  if(room){

  var users = room.users;

  delete users[socket.id];

  socket.leave(socket.room);

  var count = Object.keys(users).length;

  if(count>0){

  var data = {user_num:count,room:socket.room};

  ios.to(socket.room).emit(“online-number”, data);

  }

  }

  });

  });

  这个代码很好理解:

  客户端与服务器建立连接后,首先发送一个”user”消息给服务器,汇报用户信息。用户信息可以包括任何需要记录的信息,如:用户姓名、用户编号、所在的分组或应用(room),当前访问的页面等。

  服务器收到用户信息后记录到内存中,然后将在线用户总数发送给所有用户。

  客户端可以随时通过发送“get-users”请求消息查询在线用户列表。这个功能很酷,可以看到在线用户详细列表。

  依赖定义文件 package.json

  package.json定义这个nodejs程序运行所依赖的组件,有个这个文件之后,可以通过npm命令来安装依赖包。

  代码:

  复制

  {

  ”name”: “userCounter”,

  ”version”: “1.0.0”,

  ”description”: “a user counter nodejs app”,

  ”keywords”: [

  ”NodeJS”,

  ”OnlineUserCounter”,

  ],

  ”author”: “www.ruiboyun.com”,

  ”homepage”: “http://www.ruiboyun.com/”,

  ”private”: “false”,

  ”bundleDependencies”: [

  ”passport.socketio”

  ],

  ”dependencies”: {

  ”express”: “3.2.*”,

  ”socket.io”: “^1.3.5”,

  ”util”: “^0.10.3”

  },

  ”license”: “MIT”

  }

  原文件拷贝到代码目录即可,后面使用。

  部署与运行

  首先正确安装nodejs,参见 https://blog.51cto.com/livestreaming/2314592

  安装依赖包

  在代码根目录(app.js和package.jso所在目录)运行命令:

  复制

  npm install

  修改服务端口

  在上述app.js代码中,修改web服务端口,默认是86,确保各级防火墙开放该端口:

  复制

  var port = 86;

  运行程序

  复制

  node app.js

  客户端

  客户端代码就是网页代码啦,可以根据需要提交用户信息、显示用户数量和查询用户列表。

  示例代码:

  复制

  在线用户

  12

  效果提升

  基于这个应用,还可以实现如下效果:

  1)将在线用户数采样记录入库,用于网站热度分析和用户访问趋势分析

  2)将用户访问历史记录如库,跟踪用户访问轨迹

  北海房价 http://bh.goufang.com/

  3)提交用户信息时把昵称、头像等信息提交进来,显示用户列表时可以更酷

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
转载请注明出处: https://daima100.com/6321.html

(0)
上一篇 2023-04-12
下一篇 2023-04-12

相关推荐

  • stone structure_电子琴入门第二课

    stone structure_电子琴入门第二课StoneDB 的整体架构分为三层,分别是应用层、服务层和存储引擎层。应用层主要负责客户端的连接管理和权限验证;服务层提供了 SQL 接口、查询缓存、解析器、优化器、执行器等组件;Tianmu 引擎所

    2023-05-31
    153
  • chm索引_search索引器

    chm索引_search索引器与所有的数据库一样,Couchbase数据库必须创建索引才能进行查询。在很多关系型数据库中,创建表创建表时通常会默认创建以ID为主键索引的索引,所以很多人在上手时忽略了关系型数据库的索引。 由于Co…

    2023-03-20
    151
  • 企业组织架构图流程_运营部架构

    企业组织架构图流程_运营部架构 前言: MySQL数据库自己用了也有两三年了,基本上只是掌握增删改查的sql语句,从没有思考过MySQL的内部到底是怎么根据sql查询数据的,包括索引的原理,只知道加了索引查的就快,不知道为…

    2023-03-21
    140
  • mysql汇总和分组数据_sql 分组查询排名前三的记录

    mysql汇总和分组数据_sql 分组查询排名前三的记录10.3 汇总数据 我们经常需要汇总数据而不用把它们实际检索处出来,为此MySQL提供了专门的函数。使用这些函数,MySQL查询可用于检索数据,以便分析和报表的生成。这种类型的检索例子有以下几种: 确

    2023-01-23
    153
  • Kafka 的No kafka server to stop报错处理[通俗易懂]

    Kafka 的No kafka server to stop报错处理[通俗易懂]使用kafka-server-stop.sh命令关闭kafka服务,发现无法删除,报错如下图No kafka server to stop 下面修改kafka-server-stop.sh将 PIDS

    2022-12-22
    183
  • mysql忘记密码怎么办?_忘记密码怎么重新设置

    mysql忘记密码怎么办?_忘记密码怎么重新设置本文主要记录了在忘记密码时怎么办。

    2023-03-17
    150
  • Python Requests教程:从入门到进阶

    Python Requests教程:从入门到进阶Python是一种流行的编程语言,为开发者提供了许多功能强大的库和框架。其中,Python Requests库是一款非常流行的HTTP库,用于向网站发送请求并接收响应。它可以轻松地帮助开发人员编写爬虫、发送电子邮件、处理API请求以及处理REST API等任务。在本篇文章中,我们将介绍如何使用Python Requests库进行HTTP请求和响应处理,并探讨如何使用它来构建更高级的网络应用程序。

    2024-08-01
    32
  • 数据库发展史2-「建议收藏」

    数据库发展史2-「建议收藏」​ 回顾数据仓库的发展历程,大致可以将其分为几个阶段:萌芽探索到全企业集成时代、企业数据集成时代、混乱时代–"数据仓库之父"间的论战、理论模型确认时代以及数据仓库产品百家争鸣时代

    2023-06-06
    154

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注