SpringBoot+WebSocket实现实时获取系统数据
Posted striver20
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SpringBoot+WebSocket实现实时获取系统数据相关的知识,希望对你有一定的参考价值。
SpringBoot+WebSocket实现实时获取系统数据
-
引入maven依赖
<dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-websocket</artifactId> </dependency> <dependency> <groupId>cn.hutool</groupId> <artifactId>hutool-all</artifactId> <version>5.7.5</version> </dependency> <dependency> <groupId>com.github.ulisesbocchio</groupId> <artifactId>jasypt-spring-boot</artifactId> <version>2.0.0</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> <version>2.1.7.RELEASE</version> </dependency> </dependencies>
-
配置websocket
@Configuration public class WebSocketConfig @Bean public ServerEndpointExporter serverEndpointExporter() return new ServerEndpointExporter();
-
编写websocket类
@Component @Slf4j @ServerEndpoint("/websocket/userId") @EnableScheduling public class WebSocket private Session session; private String userId; private static CopyOnWriteArraySet<WebSocket> webSockets =new CopyOnWriteArraySet<>(); private static ConcurrentHashMap<String,Session> sessionPool = new ConcurrentHashMap<String,Session>(); @Scheduled(cron = "0/5 * * * * ?") private void configureTasks() throws UnknownHostException InetAddress address = InetAddress.getLocalHost(); String hostAddress = address.getHostAddress(); System.out.println(hostAddress); String action = "http://"+hostAddress+":8011/websocket/sa"; HttpRequest.get(action) .header("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9") .execute().body(); System.out.println("定时任务"); @OnOpen public void onOpen(Session session,@PathParam(value="userId")String userId) try this.session = session; this.userId = userId; webSockets.add(this); sessionPool.put(userId, session); log.info("【websocket消息】有新的连接,总数为:"+webSockets.size()); catch (Exception e) @OnClose public void onClose() try webSockets.remove(this); sessionPool.remove(this.userId); log.info("【websocket消息】连接断开,总数为:"+webSockets.size()); catch (Exception e) /** * 收到客户端消息后调用的方法 * * @param message */ @OnMessage public void onMessage(String message) log.info("【websocket消息】收到客户端消息:"+message); /** 发送错误时的处理 * @param session * @param error */ @OnError public void onError(Session session, Throwable error) log.error("用户错误,原因:"+error.getMessage()); error.printStackTrace(); // 此为广播消息 public void sendAllMessage(String message) log.info("【websocket消息】广播消息:"+message); for(WebSocket webSocket : webSockets) try if(webSocket.session.isOpen()) webSocket.session.getAsyncRemote().sendText(message); catch (Exception e) e.printStackTrace(); // 此为单点消息 public void sendOneMessage(String userId, String message) Session session = sessionPool.get(userId); if (session != null&&session.isOpen()) try log.info("【websocket消息】 单点消息:"+message); session.getAsyncRemote().sendText(message); catch (Exception e) e.printStackTrace(); // 此为单点消息(多人) public void sendMoreMessage(String[] userIds, String message) for(String userId:userIds) Session session = sessionPool.get(userId); if (session != null&&session.isOpen()) try log.info("【websocket消息】 单点消息:"+message); session.getAsyncRemote().sendText(message); catch (Exception e) e.printStackTrace();
-
编写controller
@RestController @RequestMapping("/websocket") class haoWebSocketController @Resource private WebSocket webSocket; @GetMapping("/userId") public void aaaa(@PathVariable("userId") String userId) OperatingSystemMXBean operatingSystemMXBean = (OperatingSystemMXBean) ManagementFactory.getOperatingSystemMXBean(); File[] files = File.listRoots(); //System.out.println("系统名称:"+operatingSystemMXBean.getName()); //System.out.println("版本:"+operatingSystemMXBean.getVersion()); //System.out.println("CPU内核:"+operatingSystemMXBean.getAvailableProcessors()); //k->G //System.out.println("机器总内存:"+Double.valueOf(operatingSystemMXBean.getTotalPhysicalMemorySize())/ 1024 / 1024 / 1024 + "GB"); //System.out.println("可用内存:"+Double.valueOf(operatingSystemMXBean.getFreePhysicalMemorySize())/ 1024 / 1024 / 1024 + "GB"); DecimalFormat decimalFormat = new DecimalFormat("0.00%"); String aa = null; if (operatingSystemMXBean.getTotalPhysicalMemorySize() > 0) aa = decimalFormat.format(Double.valueOf(operatingSystemMXBean.getFreePhysicalMemorySize()) / operatingSystemMXBean.getTotalPhysicalMemorySize()); //System.out.println("可用内存占比:"+decimalFormat.format(Double.valueOf(operatingSystemMXBean.getFreePhysicalMemorySize()) / operatingSystemMXBean.getTotalPhysicalMemorySize())); JSONObject obj = new JSONObject(); obj.put("系统名称", operatingSystemMXBean.getName());//业务类型 obj.put("版本", operatingSystemMXBean.getVersion());//业务类型 obj.put("CPU内核", operatingSystemMXBean.getAvailableProcessors());//业务类型 obj.put("机器总内存", Double.valueOf(operatingSystemMXBean.getTotalPhysicalMemorySize())/ 1024 / 1024 / 1024 + "GB");//业务类型 obj.put("可用内存", Double.valueOf(operatingSystemMXBean.getFreePhysicalMemorySize())/ 1024 / 1024 / 1024 + "GB");//业务类型 obj.put("内存占用", aa);//业务类型 //单个用户发送 (userId为用户id) webSocket.sendOneMessage(userId, obj.toJSONString());
运行测试
以上是关于SpringBoot+WebSocket实现实时获取系统数据的主要内容,如果未能解决你的问题,请参考以下文章
Spring Boot + WebSocket 实时消息推送
Spring Boot 入门:集成 WebSocket, 实时显示系统日志
JavaCV音视频开发宝典:使用JavaCV和springBoot实现websocket-flv直播服务,无需流媒体服务,浏览器网页flv.js播放器直接播放rtsp,rtmp等实时视频
JavaCV音视频开发宝典:使用JavaCV和springBoot实现websocket-flv直播服务,无需流媒体服务,浏览器网页flv.js播放器直接播放rtsp,rtmp等实时视频
JavaCV音视频开发宝典:使用JavaCV和springBoot实现websocket-flv直播服务,无需流媒体服务,浏览器网页flv.js播放器直接播放rtsp,rtmp等实时视频