一开始我是以为这两个很类似

是用同一种方法就能实现的

但是,实际上在线人数可以用session实现,而已上线人数应该用servletcontext实现.

也就是一个监听servletcontext,一个监听session

而且为了记录数据要另写一个类来记录(counter)

public class ContextListener implements ServletContextListener {public static final String NAME = "name";public static final String Talks = "talks";//static final 静态最终啥的玩意 其实就是放在application里的数据//Talks是服务器内部调用的 ContextListener.Talks//talks是web前端调用的 applicationScope.talksprivate StringBuilder talks = new StringBuilder();@Overridepublic void contextDestroyed(ServletContextEvent sce) {// TODO Auto-generated method stub
        sce.getServletContext().removeAttribute(NAME);sce.getServletContext().removeAttribute(Talks);}@Overridepublic void contextInitialized(ServletContextEvent sce) {// TODO Auto-generated method stubCounter c = new Counter();sce.getServletContext().setAttribute(NAME, c);//在服务器创建的时候,建立了一个countersce.getServletContext().setAttribute(Talks, talks);}}public class SessionListener implements HttpSessionListener{public static final String NAME = "name";private int count = 0;@Overridepublic void sessionCreated(HttpSessionEvent hse) {// TODO Auto-generated method stubHttpSession httpSession = hse.getSession();ServletContext sc = httpSession.getServletContext();Counter c = (Counter) sc.getAttribute(ContextListener.NAME);String name = "游客" + count;while (!c.addNowNames(name)){//加入成功则在counter里改变数据//加入不成功,就改变count知道加入成功count++;name = "游客" + count;}httpSession.setAttribute(NAME,name);StringBuilder sb = (StringBuilder)sc.getAttribute(ContextListener.Talks);sb.append(String.format("%s加入了!%n",name));}@Overridepublic void sessionDestroyed(HttpSessionEvent hse) {// TODO Auto-generated method stubHttpSession httpSession = hse.getSession();ServletContext sc = httpSession.getServletContext();Counter c = (Counter) sc.getAttribute(ContextListener.NAME);String name = httpSession.getAttribute(NAME).toString();c.removeNowNames(name);StringBuilder chatInfo = (StringBuilder) sc.getAttribute(ContextListener.Talks);chatInfo.append(String.format("%s离开了!%n", name));}}

用Serializable序列化来排序
public class Counter implements Serializable {
private static final long serialVersionUID = 45354343L;private int allNames = 0;private Set<String> nowNames = new LinkedHashSet<String>();public Counter() {}public boolean addNowNames(String name) {boolean r = nowNames.add(name);//如果原来有这个名字 就已上线人数增加if (r) {allNames++;}return r;}public boolean renameNowNames(String oldName, String newName) {if (nowNames.contains(oldName)) {nowNames.remove(oldName);} else {return false;}if (nowNames.add(newName)) {return true;} else {nowNames.add(oldName);return false;}}public void removeNowNames(String name) {nowNames.remove(name);}
//必须要有getxxxxxx的方法才能在jsp里被提取到public int getNowNamesSize() {//这个就是在线人数return nowNames.size();}public int getAllNames() {return allNames;}public Set<String> getNowNames() {return Collections.unmodifiableSet(nowNames);}
}

    <table align="center"><tr><td colspan="2"><table align="center" cellspacing="10"><tr><td>历史访问人数:${applicationScope.name.allNames }</td><td>在线人数:${applicationScope.name.nowNamesSize }<select><c:forEach items="${applicationScope.name.nowNames}" var="line"><!-- line是nowNames的其中一个值 --><option>${line}</option></c:forEach></select></td><td>欢迎:${sessionScope.name}</td></tr><tr><td colspan="3"><textarea rows="20" cols="80">${applicationScope.talks}</textarea></td></tr></table>

转载于:https://www.cnblogs.com/ydymz/p/6379535.html

聊天室显示在线人数和已上线人数相关推荐

  1. 模拟聊天室显示语句保持最新显示

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  2. Socket实现聊天室(二)

    午安,打工人! 最近终于终于有点闲空了,就翻了翻之前写的学习笔记,就发现了上一篇文章.依稀记得当时还是在学校里费了不少功夫才完成的,就突然想拿出来重新回顾一下顺便改进改进,如若您发现有错误或者不合理的 ...

  3. 基于PHP聊天室的编程思想

    基于PHP聊天室的编程思想 大门 -- 登陆 1 页面登陆的基本要素 你可以在我的主页看到登陆的表单,这里提供了最基本的登陆表单项 (1)登陆表单 <form method=POST name= ...

  4. php 聊天室 教程,基于PHP的聊天室编程思想-PHP教程,PHP基础

    1 页面登陆的基本要素 你可以在我的竹叶看到登陆 的表单,这里提供了最基本的登陆表单项 (1)登陆表单 (a)聊天表单的名字为chatform,我使用action=enter作为进入聊天室的入口,如果 ...

  5. 【直播聊天室】特点、构成及解决方案简介

    为方便开发者了解和接入融云直播聊天室,本文将介绍融云直播聊天室功能特点.主要构成及常见功能的解决方案. 一.产品介绍 融云直播聊天室,是专门为视频直播业务提供的一个产品.主要特点是: 丰富的聊天室消息 ...

  6. 【干货】直播聊天室详细分解,让你一眼学会快速搭建!

    直播聊天室 为方便开发者了解和接入融云直播聊天室,本文将介绍融云直播聊天室功能特点.主要构成及常见功能的解决方案. 产品介绍 融云直播聊天室,是专门为视频直播业务提供的一个产品.主要特点是: 丰富的聊 ...

  7. APP开发者如何来实现视频聊天室功能

    这是一个新型的互联网业态,直播社交业务所带来的"钱景"正吸引越来越多的玩家进入这一行业.无论是专注秀场直播的YY,网易BoBo,还是提供手机直播的爆款应用Meerkat.在2015 ...

  8. 聊天室系统测试用例设计及报告

    一.测试用例设计 1.注册功能 题目:用户注册 前提条件:已经存在三个用户,用户名分别为a,b,c,密码都为123,昵称分别为刘欢,王琦和小芳 需求:用户名和密码是必填项,昵称和用户名可以是数字.字母 ...

  9. Java实现多线程聊天室

    之前呢已经用单线程的方式来实现了聊天室,但其实它的功能并不齐全,下面用多线程来实现,功能会比单线程聊天室更加齐全,也更人性化一点 多线程版本的聊天室 1. 功能分析: 实现用户注册,上线,下线 实现群 ...

最新文章

  1. asp.net导出GridView数据到Excel
  2. sql2008 获取表结构说明
  3. c语言node类型_高阶宏的妙用技法,C语言宏你所不知道的聪明技巧
  4. 【Mac Buf Install Solution】Mac Buf Not Provide support for this old version Solution
  5. 阅文推“单本可选新合同”:授权分级、免费或付费自选
  6. 用Asp.Net创建基于Ajax的聊天室程序
  7. 阶段1 语言基础+高级_1-3-Java语言高级_06-File类与IO流_09 序列化流_2_对象的序列化流_ObjectOutputStream...
  8. 高数复习:极限与连续,一元函数微分学,一元函数积分学,多元函数微分学以及微分方程(思维导图版知识点总结)
  9. 尚硅谷李玉婷老师mysql课程--数据库和SQL概述
  10. python html5 便利店收银系统_便利店收银系统使用教程
  11. 学会Zynq(15)UDP sendto函数的使用
  12. 解决Ubuntu18.04和Win10双系统系统时间不对的问题
  13. Win10提示文件或目录损坏怎么解决?
  14. QPS,TPS,RT是什么?
  15. Java写入磁盘阵列_磁盘阵列方案
  16. HTML5:<abbr>元素
  17. 什么软件有html5游戏,多款好玩HTML5小游戏带你认识HTML5优势
  18. linux系统怎么数据恢复,linux系统数据恢复
  19. Windows设备信息获取:(摄像头,声卡为例)Qt,WindowsAPI对比说明(2)
  20. 算法题 金银铜奖牌排序

热门文章

  1. 在承德避暑山庄里待过,给你的最大感受是什么?
  2. 社区团购会一直走下去吗?
  3. 最便宜、最快和最可靠不可兼得
  4. 分布式系统领域经典论文翻译集
  5. Ubuntu配置教程
  6. 前缀,中缀,后缀表达式求值
  7. sql limit 子句_具有并行性SQL Server TOP子句性能问题
  8. SQL Server数据库指标
  9. 数学之美 与 浪潮之巅
  10. 在django中使用vue.js需要注意的地方