有时候我们需要在内容详情页实时浏览人数,这时候我们可以使用websocket实现这个功能

pom.xml

  1.           <dependency>
  2. <groupId>javax</groupId>
  3. <artifactId>javaee-api</artifactId>
  4. <version>8.0</version>
  5. <scope>provided</scope>
  6. </dependency>

 

或者jar包

javax.websocket-api-1.0.jar

下载地址:https://yvioo.lanzous.com/i3AXkhl3s3c

配置类

WebSocketConfig.java

  1. package com.config;
  2.  
  3. import javax.websocket.Endpoint;
  4. import javax.websocket.server.ServerApplicationConfig;
  5. import javax.websocket.server.ServerEndpointConfig;
  6. import java.util.Set;
  7.  
  8. public class WebSocketConfig implements ServerApplicationConfig {
  9. @Override
  10. public Set<ServerEndpointConfig> getEndpointConfigs(Set<Class<? extends Endpoint>> endpointClasses) {
  11. return null;
  12. }
  13.  
  14. @Override
  15. public Set<Class<?>> getAnnotatedEndpointClasses(Set<Class<?>> scanned) {
  16.  
  17. //在这里会把含有@ServerEndpoint注解的类扫描加载进来 ,可以在这里做过滤等操作
  18.  
  19. return scanned;
  20. }
  21. }

  

  1. 操作类
    ContentWebSocket.java
  1. package com.websocket;
  2.  
  3. import javax.websocket.*;
  4. import javax.websocket.server.ServerEndpoint;
  5. import java.io.IOException;
  6. import java.util.*;
  7.  
  8. /**
  9. * @author 。
  10. */
  11. @ServerEndpoint(value = "/content_websocket")
  12. public class ContentWebSocket {
  13.  
  14. /**
  15. * 内容集合
  16. */
  17. public static Map contentMap=new HashMap<>();
  18.  
  19. /**
  20. * 创建
  21. * @param session
  22. */
  23. @OnOpen
  24. public void onOpen(Session session) {
  25.  
  26. }
  27.  
  28. /**
  29. * 发送消息
  30. * @param contentId
  31. * @throws IOException
  32. */
  33. @OnMessage
  34. public void sendMessage(Session session,String contentId) {
  35. List c = (List) contentMap.get(contentId);
  36. if (c==null){
  37. c=new ArrayList();
  38. }
  39. c.add(session);
  40. //创建时把当前会话放在集合中,这样集合大小就是实时浏览人数
  41. contentMap.put(contentId,c);
  42. broadcast(c,c.size()+"");
  43. }
  44.  
  45. /**
  46. * 关闭
  47. */
  48. @OnClose
  49. public void onClose(Session session) {
  50. Map<String, List<String>> requestParameterMap = session.getRequestParameterMap();
  51. //关闭时从链接获取content的ID
  52. List<String> contentids = requestParameterMap.get("content_id");
  53. if (contentids!=null&&contentids.size()>0){
  54. String contentId=contentids.get(0);
  55. List c = (List) contentMap.get(contentId);
  56. if (c!=null){
  57. //从集合中移除该会话
  58. c.remove(session);
  59. contentMap.put(contentId,c);
  60. broadcast(c,c.size()+"");
  61. }
  62.  
  63. }
  64. }
  65.  
  66. /**
  67. * 发生错误
  68. * @param session
  69. * @param error
  70. */
  71. @OnError
  72. public void onError(Session session, Throwable error) {
  73. System.out.println("发生错误");
  74. error.printStackTrace();
  75. }
  76.  
  77. /**
  78. * 消息广播
  79. * @param sessions
  80. * @param msg
  81. */
  82. public void broadcast(List<Session> sessions,String msg){
  83. for (Iterator it=sessions.iterator();it.hasNext();){
  84. Session session= (Session) it.next();
  85. try {
  86. if (session.isOpen()){
  87. //当当前会话没有被关闭 发送消息
  88. session.getBasicRemote().sendText(msg);
  89. }else {
  90. it.remove();
  91. }
  92. } catch (IOException e) {
  93. e.printStackTrace();
  94. it.remove();
  95. }
  96. }
  97.  
  98. }
  99. }

  

页面代码

content.html

  1. <span id="viewing">0</span>人正在看
  2.  
  3. <script>
  4.  
  5. //观看人数统计
  6. var ws;
  7. var target="ws:localhost:8080/content_websocket?content_id=内容ID";
  8.  
  9. $(function () {
  10.  
  11. //处理浏览器兼容性
  12. if ('WebSocket' in window) {
  13. ws = new WebSocket(target);
  14. } else if ('MozWebSocket' in window) {
  15. ws = new MozWebSocket(target);
  16. } else {
  17. alert('WebSocket is not supported by this browser.');
  18. return;
  19. }
  20.  
  21. ws.onopen = function () {
  22. ws.send('${content.id}')
  23. };
  24. ws.onmessage = function (event) {
  25. $("#viewing").html(event.data);
  26. };
  27.  
  28. ws.onclose=function (event) {
  29.  
  30. }
  31.  
  32. })
  33. </script>

  

  

https://yvioo.lanzous.com/i3AXkhl3s3c

JAVA使用WebSocket显示实时在线浏览人数的更多相关文章

  1. Java用WebSocket + tail命令实现Web实时日志

    原文:http://blog.csdn.net/xiao__gui/article/details/50041673 在Linux操作系统中,经常需要查看日志文件的实时输出内容,通常会使用tail - ...

  2. Java模拟实现百度文档在线浏览

    Java模拟实现百度文档在线浏览 这个思路是我参考网上而来,代码是我实现. 采用Apache下面的OpenOffice将资源文件转化为pdf文件,然后将pdf文件转化为swf文件,用FlexPaper ...

  3. java实现在线浏览PDF文档功能

    实现在线浏览pdf文档功能(本代码适用于项目服务中固定的并且少量的pdf浏览,比如注册时的注册条款在线浏览等): //设置响应内容类型为PDF类型 response.setContentType(&q ...

  4. java集成WebSocket向指定用户发送消息

    一.WebSocket简单介绍 随着互联网的发展,传统的HTTP协议已经很难满足Web应用日益复杂的需求了.近年来,随着HTML5的诞生,WebSocket协议被提出,它实现了浏览器与服务器的全双工通 ...

  5. Java后端WebSocket的Tomcat实现(转载)

    一.WebSocket简单介绍 随着互联网的发展,传统的HTTP协议已经很难满足Web应用日益复杂的需求了.近年来,随着HTML5的诞生,WebSocket协议被提出,它实现了浏览器与服务器的全双工通 ...

  6. [转]使用 HTML5 WebSocket 构建实时 Web 应用

    HTML5 WebSocket 简介和实战演练 本文主要介绍了 HTML5 WebSocket 的原理以及它给实时 Web 开发带来的革命性的创新,并通过一个 WebSocket 服务器和客户端的案例 ...

  7. 使用 HTML5 WebSocket 构建实时 Web 应用

    原文地址:http://www.ibm.com/developerworks/cn/web/1112_huangxa_websocket/ HTML5 WebSocket 简介和实战演练 本文主要介绍 ...

  8. springboot搭建一个简单的websocket的实时推送应用

    说一下实用springboot搭建一个简单的websocket 的实时推送应用 websocket是什么 WebSocket是一种在单个TCP连接上进行全双工通信的协议 我们以前用的http协议只能单 ...

  9. (转)使用 HTML5 WebSocket 构建实时 Web 应用

    HTML5 WebSocket 简介和实战演练 本文主要介绍了 HTML5 WebSocket 的原理以及它给实时 Web 开发带来的革命性的创新,并通过一个 WebSocket 服务器和客户端的案例 ...

随机推荐

  1. Codeforces 1383E - Strange Operation(线段树优化 DP or 单调栈+DP)

    Codeforces 题目传送门 & 洛谷题目传送门 Yet another 自己搞出来的难度 \(\ge 2800\) 的题 介绍一个奇奇怪怪的 \(n\log n\) 的做法.首先特判掉字 ...

  2. Codeforces 1483F - Exam(AC 自动机)

    Codeforces 题目传送门 & 洛谷题目传送门 一道 ACAM 的 hot tea 首先建出 ACAM.考虑枚举长串,以及短串在长串中出现的最后位置 \(j\),这个复杂度显然是 \(\ ...

  3. 睡眠或者重启windows,无法ssh连接或者pingVMware的虚机

    睡眠后无法直接ssh重连VMware主机问题 这个问题我在win8上出现过,win10看了下同事可以正常连,不知道其他有没有问题. 解决方法: 1.关闭vmnet8和vmnet0里面的 npcap 功 ...

  4. git添加新账号

    1,在linux上添加账号 useradd test passwd test usermod -G gitgroup  test  将test账号的组改为和git一样的组gitgroup  git所在 ...

  5. karatsuba乘法

    karatsuba乘法 Karatsuba乘法是一种快速乘法.此算法在1960年由Anatolii Alexeevitch Karatsuba 提出,并于1962年得以发表.[1] 此算法主要用于两个 ...

  6. 为 Rainbond Ingress Controller 设置负载均衡

    Rainbond 作为一款云原生应用管理平台,天生带有引导南北向网络流量的分布式网关 rbd-gateway.rbd-gateway 组件,实际上是好雨科技团队开发的一种 Ingress Contro ...

  7. day27 网络编程

    1.OSI七层协议 1.七层划分为:应用层,表示层.会话层.传输层.网络层.数据链路层.物理层 2.五层划分:应用层.传输层.网络层.数据链路层.物理层 应用层: 表示层: 会话层: 传输层:四层交换 ...

  8. Spark(二)【sc.textfile的分区策略源码分析】

    sparkcontext.textFile()返回的是HadoopRDD! 关于HadoopRDD的官方介绍,使用的是旧版的hadoop api ctrl+F12搜索 HadoopRDD的getPar ...

  9. js 如何全部替代一个子串为另一个子串

    更多描述: 假设有一个字符串 `hello. hello. hello. ` 需要替换为 `AAA`,即把 `hello. ` 替换为 `A` 如果需要全量替换字符串,可以使用 String.prot ...

  10. Spring的事务传播机制(通俗易懂)

    概述 Spring的事务传播机制有7种,在枚举Propagation中有定义. 1.REQUIRED PROPAGATION_REQUIRED:如果当前没有事务,就创建一个新事务,如果当前存在事务,就 ...