websocket统计在线人数

本文介绍了一种使用WebSocket实现客户端与服务器实时双向通信的技术方案。包括后端Java代码实现及前端连接逻辑,支持内容ID作为唯一标识进行会话管理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

**

后端代码

**`package gds.application.gds.webSorce;

import gds.application.gds.httpclient.RemoteAccess;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.util.ObjectUtils;

import javax.websocket.*;
import javax.websocket.server.ServerEndpoint;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**

  • @ClassName SystemWebSocketHandler

  • @Description:

  • @Author: LWJ

  • @CreateDate: 2021/6/10 14:20
    /
    @ServerEndpoint("/websocket")
    public class SystemWebSocketHandler {
    private final static Logger log = LoggerFactory.getLogger(SystemWebSocketHandler.class);
    /
    *

    • 内容集合
      */
      public static Map contentMap=new HashMap<>();
      // 与某个客户端的连接会话,需要通过它来给客户端发送数据
      private Session session;

    /**

    • 连接建立成功调用的方法
    • @param session
    •        可选的参数。session为与某个客户端的连接会话,需要通过它来给客户端发送数据
      

    */
    @OnOpen
    public void onOpen(Session session) {
    this.session = session;
    Map<String, List> requestParameterMap = session.getRequestParameterMap();
    //关闭时从链接获取content的ID
    List contentids = requestParameterMap.get(“content_id”);
    if (contentids!=null&&contentids.size()>0) {
    String contentId = contentids.get(0);
    if (ObjectUtils.isEmpty(contentMap.get(contentId))){
    contentMap.put(contentId,session);
    }
    }
    log.info(“有新连接加入!当前在线人数为” + getOnlineCount());
    }

    /**

    • 连接关闭调用的方法
      */
      @OnClose
      public void onClose(Session session) {
      Map<String, List> requestParameterMap = session.getRequestParameterMap();
      //关闭时从链接获取content的ID
      List contentids = requestParameterMap.get(“content_id”);
      if (contentids!=null&&contentids.size()>0){
      String contentId=contentids.get(0);
      contentMap.remove(contentId);
      }
      log.info(“有一连接关闭!当前在线人数为” + getOnlineCount());
      }

    public static synchronized int getOnlineCount() {
    return contentMap.size();
    }

}
`

前端代码
content_id 做唯一标识
var websocket = null;
//判断当前浏览器是否支持WebSocket
if (‘WebSocket’ in window) {
websocket = new WebSocket(“ws://vr.epgc.mtn:8080/websocket?content_id=${accountID}”);
}
else {
alert(‘当前浏览器 Not support websocket’)
}

//监听窗口关闭事件,当窗口关闭时,主动去关闭websocket连接,防止连接还没断开就关闭窗口,server端会抛异常。
window.onbeforeunload = function () {
	closeWebSocket();
}

//关闭WebSocket连接
function closeWebSocket() {
	websocket.close();
}
### 使用 WebSocket 实现在线人数统计 #### 前端代码实现 为了初始化 WebSocket 连接并处理各种事件,可以使用如下 JavaScript 代码: ```javascript function initWebSocket(url) { if ("WebSocket" in window) { let webSocket = new WebSocket(url); console.log(webSocket); // 打开连接后的操作 webSocket.onopen = function() { webSocketOpen(); }; // 接收到服务器消息的操作 webSocket.onmessage = function(event) { webSocketOnMessage(event); }; // 关闭连接后的操作 webSocket.onclose = function() { webSocketClose(); }; // 错误处理 webSocket.onerror = function() { console.log("WebSocket连接发生错误"); }; } else { alert("该浏览器不支持WebSockets!"); } } ``` 上述代码展示了如何建立 WebSocket 连接以及定义相应的事件处理器[^1]。 #### 后端 Java 配置 对于后端部分,Java 可以通过 `javax.websocket` API 来配置 WebSocket 的服务端点。下面是一个简单的例子来展示如何设置 WebSocket 并管理客户端会话列表以便追踪当前活跃用户的数量: ```java import java.util.HashSet; import java.util.Set; import javax.websocket.OnClose; import javax.websocket.OnError; import javax.websocket.OnMessage; import javax.websocket.OnOpen; import javax.websocket.Session; import javax.websocket.server.ServerEndpoint; @ServerEndpoint("/ws") public class UserCountWebSocket { private static Set<Session> sessions = new HashSet<>(); @OnOpen public void onOpen(Session session) { synchronized (sessions) { sessions.add(session); broadcastUserCount(); } } @OnMessage public String onMessage(String message, Session session) { return "Received: " + message; } @OnClose public void onClose(Session session) { synchronized (sessions) { sessions.remove(session); broadcastUserCount(); } } @OnError public void onError(Throwable error) { System.out.println("An error occurred: " + error.getMessage()); } private void broadcastUserCount() { int count = sessions.size(); for (Session s : sessions) { try { s.getBasicRemote().sendText("Current online users: " + count); } catch (IOException e) { e.printStackTrace(); } } } } ``` 这段代码实现了当有新的 WebSocket 客户端加入或离开时更新在线用户数,并向所有已连接的客户端广播最新的在线人数信息[^2]。 #### 数据库交互与权限控制 如果还需要更复杂的功能比如记录特定直播间的在线观众或是实施临时/永久性的禁言措施,则可以在业务逻辑层面上进一步扩展功能。例如,在调用某个接口之前先检查用户状态是否被标记为“禁言”,并在适当的时候执行数据库写入操作保存这些变更[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值