一个统计当前在线用户的解决方案,可以在聊天室、论坛、网站中使用

在做一个在线交流的网站时,有个问题很令我头疼,就是关于实时统计在线用户的问题,客户要求:统计当前在线人数、游客人数、会员人数、在线用户列表,包括游客、会员和管理员(如果是游客,则自动生成游客的ID,如果是会员,则显示会员姓名)。因为它要求有实时性,则首先我将用global.asa解决的想法pass掉。

问题的关键是如何判断用户已经离开,和当用户离开时如何执行一个文件或一个函数。

经过和网上一些朋友的探讨,终于解决了这个问题。

解决的原理为:编写一个通用页面,所谓的通用页面,就是应用里的每个页面都包含这个页面,例如:header.asp,在这个页面里,用XMLHTTP写一段代码,这段代码的作用是每隔10秒或20秒就向服务器发送一个请求,目的是更新当前用户的在线时间并删除在线时间超过一定时间的用户,使数据库中的在线用户记录保持一定的实时性。

主要实现方法为:

新建一数据库,字段名称分别为:id(字符),name(字符),user(数字)tt(日期),admin(权限代码,0-普通用户,1-管理员)

表名:online

header.asp ↓

============================================================

<%

... ...

if session("s_in")<>1 and session("s_name")="" then    '如果用户是第一次登陆

 rs.open "select * from online",conn,3,3
  rs.addnew
   rs("id")=session.sessionID
   rs("name")="游客" & session.sessionID
   rs("user")=0      '0表示用户未登陆,是游客身份
   rs("tt")=now
  rs.update
 rs.close
 session("s_in")=1     '设置用户的资料已经存入数据库,表示已经在线
end if

if session("s_name")<>"" then      '如果用户已经通过登录框登录
 rs.open "select * from online where id='" & session.sessionID & "'",conn,3,3
   rs("name")=session("s_name")
   rs("admin")=session("s_admin")    '将用户的姓名更新为会员名称
   rs("user")=1         '表示用户已经登陆,是会员身份
   rs("tt")=now        '将当前系统时间设置为用户的登陆时间
  rs.update
 rs.close
end if

... ...

%>

... ...

<head>

... ...

   <script language=javascript>
    function Test()
    {
    var xmlhttp = new ActiveXObject("MSXML2.XMLHTTP");
    xmlhttp.open("POST","onceonline.asp",false);  // 向onceonline.asp发送更新请求
    xmlhttp.setRequestHeader("CONTENT-TYPE","application/x-www-form-urlencoded");
    xmlhttp.send();
    }
    setInterval("Test();",10); // 10秒钟发送一次更新请求
   </script>

... ...

</head>

... ...

==========================================================

onceonline.asp

<%
rs.open "select tt from online where id='" & session.sessionID & "'",conn,3,3
rs("tt")=now()        '更新当前在线用户的在线时间
rs.update
rs.close

rs.open "delete from online where datediff('s',tt,now())>60",conn,3,1  '删除超时用户
%>

==============================================================

这样,基本保证了数据库中用户列表的实时性,误差取决于更新时间和删除时间的差值大小和服务器的处理速度,建议不要将删除超时用户的时间间隔取的过于小,那样有可能会导致在线用户0人的失误。

本方案在WIN2000+SQL Server2000上调试通过,由于本方案对系统要求比较大,期待其他朋友拿出更好的方案,一起解决这个问题!

应用实例:http://www.xinsiwei99.com(在线列表、在线交流)

我的信箱:my5243@hotmail.com

我叫“积木”,欢迎你和我成为朋友!

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要创建一个简单的多人在线聊天室,您需要使用Python的Socket编程库。下面是一个基本的示例: ```python import socket import threading # 创建一个TCP Socket server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 绑定到本地IP地址和端口号 server_socket.bind(('localhost', 8000)) # 开始监听客户端连接 server_socket.listen() # 广播消息给所有已连接的客户端 def broadcast(message, clients): for client in clients: client.send(message) # 处理客户端连接 def handle_client(client_socket, clients): while True: try: # 接收消息 message = client_socket.recv(1024) # 广播消息给所有客户端 broadcast(message, clients) except: # 如果连接断开,则从客户端列表删除此客户端 clients.remove(client_socket) break # 客户端连接列表 clients = [] while True: # 等待客户端连接 client_socket, address = server_socket.accept() # 将新客户端添加到客户端列表 clients.append(client_socket) # 创建一个新线程来处理此客户端连接 client_thread = threading.Thread(target=handle_client, args=(client_socket, clients)) client_thread.start() ``` 在上面的代码,我们首先创建了一个TCP Socket并绑定到本地IP地址和端口号。然后,我们开始监听客户端连接。一旦有新的客户端连接,我们将其添加到客户端列表,并创建一个新的线程来处理此客户端连接。在handle_client函数,我们接收客户端发送的消息并广播给所有已连接的客户端。如果连接断开,我们从客户端列表删除此客户端。 请注意,这只是一个基本示例,需要根据实际需求进行修改和扩展。例如,您可能需要添加身份验证和安全性措施,以确保只有经过身份验证的用户才能连接到聊天室

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值