Al crear un sitio web para la comunicación en línea, hay un problema que me causa dolor de cabeza: las estadísticas en tiempo real de los usuarios en línea que el cliente requiere: contar la cantidad actual de personas en línea, la cantidad de visitantes, la cantidad de miembros. y la lista de usuarios en línea, incluidos visitantes, miembros y miembros de administración (si es un visitante, la identificación del visitante se genera automáticamente; si es un miembro, se muestra el nombre del miembro). Debido a que requiere rendimiento en tiempo real, primero transmitiré la idea de usar global.asa para resolverlo.
La clave del problema es cómo determinar que el usuario se ha ido y cómo ejecutar un archivo o una función cuando el usuario se va.
Después de discutir con algunos amigos en Internet, finalmente resolví este problema.
El principio de la solución es: escribir una página universal. La llamada página universal significa que cada página de la aplicación contiene esta página, por ejemplo: header.asp En esta página, escriba un fragmento de código usando XMLHTTP. El código es Se envía una solicitud al servidor cada 10 segundos o 20 segundos, con el propósito de actualizar el tiempo en línea del usuario actual y eliminar los usuarios cuyo tiempo en línea excede un cierto tiempo, de modo que los registros de usuarios en línea en la base de datos mantengan un cierto tiempo real. -naturaleza del tiempo.
El método de implementación principal es:
crear una nueva base de datos, los nombres de los campos son: id (carácter), nombre (carácter), usuario (número) tt (fecha), admin (código de autoridad, 0-usuario normal, 1-administrador)
tabla nombre:
encabezado en línea.asp ↓
============================================ === ================
<%
... ...
si sesión("s_in")<>1 y sesión("s_name")="" entonces 'Si el usuario inicia sesión una vez en
rs.open "select * from online",conn,3,3
rs.añadirnuevo
rs ("id") = sesión.ID de sesión
rs("nombre")="Invitado" & session.sessionID
rs("user")=0 '0 significa que el usuario no ha iniciado sesión y es un visitante.
rs("tt")=ahora
rs.actualización
rs.cerrar
session("s_in")=1 'Establecer que la información del usuario se ha almacenado en la base de datos, lo que indica que está en línea
end if
if session("s_name")<>"" entonces 'Si el usuario ha iniciado sesión a través del cuadro de inicio de sesión
rs.open "seleccione * desde en línea donde id='" & session.sessionID & "'",conn,3,3
rs("nombre")=sesión("s_nombre")
rs("admin")=session("s_admin") 'Actualiza el nombre del usuario al nombre del miembro
rs("user")=1 'Indica que el usuario ha iniciado sesión y es miembro
rs("tt")=now 'Establece la hora actual del sistema según la hora de inicio de sesión del usuario
rs.actualización
rs.cerrar
finalizar si
... ...
%>
... ...
<cabeza>
... ...
<lenguaje de script=javascript>
prueba de función()
{
var xmlhttp = nuevo ActiveXObject("MSXML2.XMLHTTP");
xmlhttp.open("POST","onceonline.asp",false); //Enviar solicitud de actualización a onceonline.asp
xmlhttp.setRequestHeader("TIPO DE CONTENIDO","aplicación/x-www-form-urlencoded");
xmlhttp.send();
}
setInterval("Test();",10); //Enviar una solicitud de actualización cada 10 segundos
</script>
... ...
</head>
... ...
=============================== =============================
onceonline.asp
<%
rs.open "seleccione tt desde en línea donde id='" & session.sessionID & "'",conn,3,3
rs("tt")=now() 'Actualiza la hora en línea del usuario en línea actual
rs.actualización
rs.close
rs.open "eliminar de en línea donde dateiff('s',tt,now())>60",conn,3,1 'Eliminar usuario de tiempo de espera
%>
================================================== ==============
De esta manera, la naturaleza en tiempo real de la lista de usuarios en la base de datos está básicamente garantizada. El error depende de la diferencia entre el tiempo de actualización y el tiempo de eliminación. velocidad de procesamiento del servidor. Se recomienda no exceder el tiempo de eliminación. Si el intervalo de tiempo entre usuarios es demasiado pequeño, puede provocar errores entre los usuarios en línea.
Esta solución se ha depurado en WIN2000 + SQL Server2000. Dado que esta solución tiene requisitos de sistema relativamente grandes, espero que otros amigos encuentren mejores soluciones y resuelvan este problema juntos.
Mi buzón de correo: [email protected]
Mi nombre es "Building Blocks", ¡puedes hacerte amigo mío!