⑴ java 怎么实现限制用户在线人数,求实例
锁加单例:
publicclassRegist{
privatestaticRegistrgst=newRegist();
privateRegist(){}
privateintcnt=0;
privateintmax=100;
publicstaticgetRegist(){returnrgst;}
///设置最大上线人数
publicvoidsetMax(intmax){this.max=max;}
///判断新用户能否登入
(){
if(cnt>=max)returnfalse;
++cnt;
returntrue;
}
///用户退出时调用
publicsynchronizedvoidlogout(){
--cnt;
}
};
有新用户要登入时,先Regist::getRegist().login()判断能否登入,返回true则表示没到用户上限,可以登入,否则表示到上限了,不能登入,用户退出时需要调用Regist::getRegist().logout()
synchronized不清楚可以网络,是种类似锁的东西。作用于方法上,相当于调用方法前先lock,调用之后unlock,其锁的对象是该方法的类对象。
线程不是太多可以用这个方法,线程太多用这个可能慢了些,好像加锁比较耗时间,如果同一个时间太多人进行登入操作,都得在那等着,一个一个进行,反应慢
⑵ Java多个用户同时登入时,如何将用户对象存放到Session里
第一种方式,每次登录 都需要操作数据库,多了一些不必要的性能开销,而且在登录状专态下 万一突属然电脑关闭了,那就永远都不能登录了,可用性比较低。
但是第二种方式就不一样了,可操作性强,很方便维护所有在线用户的信息。
在处理登录的login方法中,先查询数据库验证下该用户是否存在,如果存在 判断该登录账户是否已经锁定了, 然后从application内置作用域对象中取出所有的登录信息,查看该username账户是否已经登录,如果登录了,就友好提示下,反之表示可以登录,将该登录信息以键值对的方式保存在application中。
⑶ 如何实现java 用户在线实时统计
您好,这样:
通过SessionListenr可以监听session的创建和销毁,所以首先要写一个类MySessionListener,实现javax.servlet.http.HttpSessionListener接口及其sessionCreated()、sessionDestroyed()方法:
import java.util.HashSet;
import javax.servlet.ServletContext;
import javax.servlet.http.HttpSession;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;
public class MySessionListener implements HttpSessionListener {
public void sessionCreated(HttpSessionEvent event) {
HttpSession session = event.getSession();
ServletContext application = session.getServletContext();
// 在application范围由一个HashSet集保存所有的session
HashSet sessions = (HashSet) application.getAttribute("sessions");
if (sessions == null) {
sessions = new HashSet();
application.setAttribute("sessions", sessions);
}
// 新创建的session均添加到HashSet集中
sessions.add(session);
// 可以在别处从application范围中取出sessions集合
// 然后使用sessions.size()获取当前活动的session数,即为“在线人数”
}
public void sessionDestroyed(HttpSessionEvent event) {
HttpSession session = event.getSession();
ServletContext application = session.getServletContext();
HashSet sessions = (HashSet) application.getAttribute("sessions");
// 销毁的session均从HashSet集中移除
sessions.remove(session);
}
}
然后再在web.xml中分别配置SessionListener和session超时时间(10分钟):
<listener>
<listener-class>全路径MySessionListener</listener-class>
</listener>
<session-config>
<session-timeout>10</session-timeout>
</session-config>
最后在jsp页面代码使用以下代码就可以实现当前在线人数统计输出:
⑷ JavaWeb开发网站,监测用户在线状态
用ajax吧。
网页里面加点javascript代码,在后台每120秒和服务器端通信一次。失败的话,表示客户端退出了
不过这样,服务器并发压力很大。
⑸ java 代码怎么在页面现在当前用户是在线状态呢
我开发论坛时写的,效果偶尔有一两个人的误差,但完全可忽略:
package com;
public class OnlineCount
implements HttpSessionListener
{
private static int activeSessions = 0;
public void sessionCreated(HttpSessionEvent se) {
activeSessions += 1;
}
public void sessionDestroyed(HttpSessionEvent se) {
if (activeSessions > 0)
activeSessions -= 1;
}
public static int getActiveSessions() {
return activeSessions;
}
}
jsp页面调用:
<%=OnlineCount.getActiveSessions()%>
希望对你有帮助,如果有改进方案,一起探讨哦,嘿嘿
也要配置web.xml:
<listener>
<listener-class>com.OnlineCount</listener-class>
</listener>
⑹ java-web怎么获取在线用户列表
如果要在页面中看到所有登陆用户的信息的话,必须在每个用户登陆成功以后,把该用户信息存入application中。然后在jsp页面上把application中存放的所有用户列表取出来,显示在画面上,这样返回给客户端的页面上就能看到所有的登陆用户列表。示例如下:
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String userName = request.getParameter("username");
ServletContext application = req.getServletContext();
ArrayList loginList = (ArrayList)application.getAttribute("loginlist");
if(loginList == null){
loginList = new ArrayList();
application.setAttribute("loginlist",loginList);
}
loginList.add(userName);
req.getRequestDispatcher("/WEB-INF/jsp/main.jsp").forward(req,resp);
}
⑺ java网页中怎样统计在线人数
1.用session超时,session为null就表示下线了
2.也可以采用数据库中设置 临时表 来处理
一个用户登陆时向表中插进一条记录,用户离开时候删除该记录
如想统计在线人数,简单地执行
select count(*) from table... 即可
3.application对象中可以记住现在的人数,application的生命周期和服务器的生命周期一样长。
4.还有一种方法要用到一个文件global.jsa ,方法是(在JSP中)是sessionDestroy(),其中它是以session对象为参数的。还有要把global.jsa文件必须房子和JSP程序相同的文件目录内才行。
5.网页自动刷新的代码是:
在文件头部加上
<meta http-equiv="refresh" content="15">
刷新间隔时间是15秒
6.在session中加入监听类,类的示例代码如下:
onLineUser.java
import javax.servlet.http.*;
import javax.servlet.*;
import java.util.*;
public class onLineUser implements HttpSessionBindingListener {
public onLineUser(){
}
private Vector users=new Vector();
public int getCount(){
users.trimToSize();
return users.capacity();
}
public boolean existUser(String userName){
users.trimToSize();
boolean existUser=false;
for (int i=0;i<users.capacity();i++ )
{
if (userName.equals((String)users.get(i)))
{
existUser=true;
break;
}
}
return existUser;
}
public boolean deleteUser(String userName) {
users.trimToSize();
if(existUser(userName)){
int currUserIndex=-1;
for(int i=0;i<users.capacity();i++){
if(userName.equals((String)users.get(i))){
currUserIndex=i;
break;
}
}
if (currUserIndex!=-1){
users.remove(currUserIndex);
users.trimToSize();
return true;
}
}
return false;
}
public Vector getOnLineUser()
{
return users;
}
public void valueBound(HttpSessionBindingEvent e) {
users.trimToSize();
if(!existUser(e.getName())){
users.add(e.getName());
System.out.print(e.getName()+"\t 登入到系统\t"+(new Date()));
System.out.println(" 在线用户数为:"+getCount());
}else
System.out.println(e.getName()+"已经存在");
}
public void valueUnbound(HttpSessionBindingEvent e) {
users.trimToSize();
String userName=e.getName();
deleteUser(userName);
System.out.print(userName+"\t 退出系统\t"+(new Date()));
System.out.println(" 在线用户数为:"+getCount());
}
}
jsp:
<%@ page contentType="text/html;charset=gb2312" %>
<%@ page import="java.util.*" %>
<jsp:useBean id="onlineuser" class="temp.jb.onLineUser" scope="application"/>
<html>
<head>
</head>
<body onUnload="postMessage()">
<center>
<p><h1>登陆成功,欢迎访问</h1></p>
</center>
<% session = request.getSession(false); %>
<%
String username=request.getParameter("username");
if (onlineuser.existUser(username)){
out.println("用户<font color=red>"+username+"</font>已经登陆!");
}else{
session.setMaxInactiveInterval(50); //Sesion有效时长,以秒为单位
session.setAttribute(username,onlineuser);
out.println("欢迎新用户:<font color=red>"+username+"</font>登陆到系统!");
}
out.println("<br>当前在线用户人数:<font color=red>"+onlineuser.getCount()+"</font><br>");
String ip = request.getRemoteAddr();
out.println("<br>IP:<font color=red>"+ip+"</font><br>");
Vector vt=onlineuser.getOnLineUser();
Enumeration e = vt.elements();
out.println("在线用户列表");
out.println("<table border=1>");
out.println("<tr><td>用户名</td></tr>");
while(e.hasMoreElements()){
out.println("<tr><td>");
out.println((String)e.nextElement()+"<br>");
out.println("</td></tr>");
}
out.println("</table>");
%>
<center>
<p> </p>
[<a href="javascript:window.close()">关闭窗口</a>]
<%
out.println("<p><a href='logout.jsp?username="+username+"'>退出系统</a></p>");
%>
</center>
<Script>
function postMessage(){
<%onlineuser.deleteUser(request.getParameter("username"));%>
}
</Script>
</body>
</html>
⑻ 疯狂Java讲义:使用MulticastSocket实现多点广播(2)
下面将结合MulticastSocket和DatagramSocket开发一个简单的局域网内的即时通信工具 局域网内每个用户启动该工具后 就可以看到该局域网内所有在线用户 他也会被其他用户看到 即看到如图 所示的窗口
在图 的用户列表中双击任意一个用户 即可启动一个如图 所示的交谈窗口
图 局域网聊天工具
图 与特定用户交谈
如果双击图 所示用户列表窗口中 所有人 列表项 即可启动一个与图 相似的交谈窗口 不同的是通过该窗口发送的消息将会被所有人看到
该程序的实现思路是每个用户都启动 个Socket 一个MulticastSocket 一个DatagramSocket
其中MulticastSocket会周期性地向 发送在线信息 且所有用户的MulticastSocket都会加入到 这个多点广播IP中 这样每个用户都可以收到其他用户广播的在线信息 如果系统经过一段时间没有收到某个用户广播的在线信息 则从用户列表中删除该用户 除此之外 该MulticastSocket还用于向所有用户发送广播信息
DatagramSocket主要用于发送私聊信息 当用户收到其他用户广播来的DatagramPacket时 即可获取该用户MulticastSocket对应的SocketAddress 这个SocketAddress将作为发送私聊信息的重要依据 本程序让MulticastSocket在 端口监听 而DatagramSocket在 端口监听 这样程序就可以根据其他用户广播来的DatagramPacket得到他的DatagramSocket所在的地址
本系统提供了一个UserInfo类 该类封装了用户名 图标 对应的SocketAddress以及该用户对应的交谈窗口 失去联系的次数等信息 该类的代码片段如下
程序清单 codes/ / /LanTalk/UserInfo java
public class UserInfo
{
//该用户的图标
private String icon;
//该用户的名字
private String name;
//该用户的MulitcastSocket所在的IP和端口
private SocketAddress address;
//该用户失去联系的次数
private int lost;
//该用户对应的交谈窗口
private ChatFrame chatFrame;
public UserInfo(){}
//有参数的构造器
public UserInfo(String icon String name SocketAddress address int lost)
{
this icon = icon;
this name = name;
this address = address;
this lost = lost;
}
//此处省略了该类所有属性的setter和getter方法
…
//使用address作为该用户的标识 所以根据address作为
//重写hashCode()和equals方法的标准
public int hashCode()
{
return address hashCode()
}
public boolean equals(Object obj)
{
if (obj != null && obj getClass()==UserInfo class)
{
return ((UserInfo)obj) getAddress() equals(address)
}
return false;
}
}
返回目录 疯狂Java讲义
编辑推荐
Java程序性能优化 让你的Java程序更快 更稳定
新手学Java 编程
lishixin/Article/program/Java/hx/201311/27257
⑼ 用java实现web在线客服功能.不需要任何插件,用jsp和servlet如何实现。或者拿ssh框架。求源码或者详细思路
我尝试了两种不同的方案来解决在线客服的问题。首先,我排除了使用插件的可能性,这意味着像QQ或MSN这样的即时通讯工具无法实现这一目标。
第一个方案是采用网页聊天的形式。客服人员和客户分别在不同的网页上进行交流。我们利用了Ajax技术,当某一方发送消息时,JavaScript会监控该页面的输入端,然后将消息发送至服务器。服务器处理消息后,再将消息发送给另一方。接收方的页面会进行局部刷新,以显示新收到的消息。
第二个方案是开发一个Applet小程序,通过TCP/IP协议实现通信。我们将这个Applet嵌入到网页中,用户需要客服时可以运行这个小程序。这样,用户可以更直接地与客服人员进行交流。
这两个方案各有优缺点。使用网页聊天的形式更加简洁,但可能需要更多的前端开发工作。而Applet小程序则提供了一种更加直接的交互方式,但可能需要更多的技术投入。
在实际应用中,我更倾向于选择第一个方案。它不仅不需要额外安装插件,还可以利用现有的浏览器功能,使得用户可以更方便地与客服人员进行交流。
通过这两个方案的实现,我学到了如何利用Ajax技术实现网页间的消息传递,以及如何使用Applet进行网络通信。这些经验对于进一步开发在线客服系统非常有帮助。