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

pom.xml

          <dependency>
<groupId>javax</groupId>
<artifactId>javaee-api</artifactId>
<version>8.0</version>
<scope>provided</scope>
</dependency>

 

或者jar包

javax.websocket-api-1.0.jar

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

配置类

WebSocketConfig.java

package com.config;

import javax.websocket.Endpoint;
import javax.websocket.server.ServerApplicationConfig;
import javax.websocket.server.ServerEndpointConfig;
import java.util.Set; public class WebSocketConfig implements ServerApplicationConfig {
@Override
public Set<ServerEndpointConfig> getEndpointConfigs(Set<Class<? extends Endpoint>> endpointClasses) {
return null;
} @Override
public Set<Class<?>> getAnnotatedEndpointClasses(Set<Class<?>> scanned) { //在这里会把含有@ServerEndpoint注解的类扫描加载进来 ,可以在这里做过滤等操作 return scanned;
}
}

  

操作类
ContentWebSocket.java
package com.websocket;

import javax.websocket.*;
import javax.websocket.server.ServerEndpoint;
import java.io.IOException;
import java.util.*; /**
* @author 。
*/
@ServerEndpoint(value = "/content_websocket")
public class ContentWebSocket { /**
* 内容集合
*/
public static Map contentMap=new HashMap<>(); /**
* 创建
* @param session
*/
@OnOpen
public void onOpen(Session session) { } /**
* 发送消息
* @param contentId
* @throws IOException
*/
@OnMessage
public void sendMessage(Session session,String contentId) {
List c = (List) contentMap.get(contentId);
if (c==null){
c=new ArrayList();
}
c.add(session);
//创建时把当前会话放在集合中,这样集合大小就是实时浏览人数
contentMap.put(contentId,c);
broadcast(c,c.size()+"");
} /**
* 关闭
*/
@OnClose
public void onClose(Session session) {
Map<String, List<String>> requestParameterMap = session.getRequestParameterMap();
//关闭时从链接获取content的ID
List<String> contentids = requestParameterMap.get("content_id");
if (contentids!=null&&contentids.size()>0){
String contentId=contentids.get(0);
List c = (List) contentMap.get(contentId);
if (c!=null){
//从集合中移除该会话
c.remove(session);
contentMap.put(contentId,c);
broadcast(c,c.size()+"");
} }
} /**
* 发生错误
* @param session
* @param error
*/
@OnError
public void onError(Session session, Throwable error) {
System.out.println("发生错误");
error.printStackTrace();
} /**
* 消息广播
* @param sessions
* @param msg
*/
public void broadcast(List<Session> sessions,String msg){
for (Iterator it=sessions.iterator();it.hasNext();){
Session session= (Session) it.next();
try {
if (session.isOpen()){
//当当前会话没有被关闭 发送消息
session.getBasicRemote().sendText(msg);
}else {
it.remove();
}
} catch (IOException e) {
e.printStackTrace();
it.remove();
}
} }
}

  

页面代码

content.html

<span id="viewing">0</span>人正在看

<script>

    //观看人数统计
var ws;
var target="ws:localhost:8080/content_websocket?content_id=内容ID"; $(function () { //处理浏览器兼容性
if ('WebSocket' in window) {
ws = new WebSocket(target);
} else if ('MozWebSocket' in window) {
ws = new MozWebSocket(target);
} else {
alert('WebSocket is not supported by this browser.');
return;
} ws.onopen = function () {
ws.send('${content.id}')
};
ws.onmessage = function (event) {
$("#viewing").html(event.data);
}; ws.onclose=function (event) { } })
</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 809E - Surprise me!(虚树+莫比乌斯反演)

    Codeforces 题目传送门 & 洛谷题目传送门 1A,就 nm 爽( 首先此题一个很棘手的地方在于贡献的计算式中涉及 \(\varphi(a_ia_j)\),而这东西与 \(i,j\) ...

  2. Atcoder Grand Contest 006 D - Median Pyramid Hard(二分+思维)

    Atcoder 题面传送门 & 洛谷题面传送门 u1s1 Atcoder 不少思维题是真的想不出来,尽管在 Atcoder 上难度并不高 二分答案(这我倒是想到了),检验最上面一层的数是否 \ ...

  3. Mysql in子查询中加limit报错

    Mysql in子查询中加limit报错 select id from aa where id in ( select id from bb limit 10 ); 改写成 SELECT id FRO ...

  4. 毕业设计之dns搭建:

    [apps@dns_sever ~]$ sudo yum install -y bind [apps@dns_sever ~]$ sudo vim /etc/named.conf // // name ...

  5. open 函数小结

    umask 掩码 open 函数的时候需要注意,掩码去反之后和设置的值想与,得到真正的值. 可以在命令行 使用umask 来查询 umask 000 设置掩码

  6. A Child's History of England.33

    To strengthen his power, the King with great ceremony betrothed his eldest daughter Matilda, then a ...

  7. day09 orm查询优化相关

    day09 orm查询优化相关 今日内容概要 orm字段相关补充 orm查询优化相关 orm事务操作 图书管理系统练习 今日内容详细 orm事务操作 """ 事务:ACI ...

  8. 13. 搭建arm-linux-gcc交叉编译环境

    1.下载工具并解压 下载路径  http://www.arm9.net/download.asp 将 arm-linux-gcc-4.5.1-v6-vfp-20120301.tgz 拷贝到 Linux ...

  9. jQuery无限载入瀑布流 【转载】

    转载至 http://wuyuans.com/2013/08/jquery-masonry-infinite-scroll/ jQuery无限载入瀑布流 好久没更新日志了,一来我比较懒,二来最近也比较 ...

  10. mybatis-plus条件构造用is开头的Boolean类型字段时遇到的问题

    is打头的Boolean字段导致的代码生成器与lambda构造器的冲突 https://gitee.com/baomidou/mybatis-plus/issues/I171DD?_from=gite ...