Java网络Socket编程-websocket

news/2024/5/16 23:34:06

实现一个用于监测 WebSocket 连接状态的线程类,其作用是通过创建一个 WebSocket 客户端,连接到指定的 WebSocket 地址,并监测连接的状态。

代码中的 WebSocketThread 类继承自 Thread,意味着它可以在单独的线程中执行。该线程类使用 Tyrus 提供的 @ClientEndpoint 注解来标识这是一个 WebSocket 客户端端点。

在代码中,通过定义 @OnOpen@OnMessage@OnClose@OnError 注解的方法,来处理与 WebSocket 连接相关的事件。例如,在 onOpen 方法中,当连接成功建立时,会将 session 对象赋值,并重置重连次数。

通过调用 connect 方法,可以创建一个 WebSocket 客户端,并连接到指定的 WebSocket 地址。在连接过程中,会触发 @OnOpen 注解的方法。

run 方法中,循环执行连接和断开连接的操作。在每次连接成功后,使用一个内部循环来定时检查连接状态。如果超过设定的连接超时时间 connectTimeout,仍未收到消息或心跳,则认为连接已关闭,更新监控 WebSocket 的状态为 "CLOSE"。如果在超时时间内收到了消息或心跳,更新监控 WebSocket 的状态为 "OPEN"。

通过调用 close 方法,可以关闭 WebSocket 连接,并更新监控 WebSocket 的状态为 "CLOSE"。

代码中的 running 变量用于控制线程的运行状态,当调用 stopThread 方法时,将设置 runningfalse,从而终止线程的执行。

此线程在连接断开后会尝试重新连接,并通过计数器 reconnectTimes 控制重连次数和心跳间隔。在每次重连时,会等待一段时间后再次尝试连接。每次重连后都会检查连接状态并更新监控 WebSocket 的状态。

请注意,该代码片段中使用了一些自定义的类和接口,例如 IMonWebsocketService,这些类和接口在代码中没有给出具体实现。因此,要使代码正常运行,需要确保相关的类和接口已经正确实现,并且适配于你的应用程序环境

import org.glassfish.tyrus.client.ClientManager;import javax.websocket.*;
import java.net.URI;
@ClientEndpoint
public class WebSocketThread extends Thread{private Session session;private volatile boolean running = true;private Long websocketId;private String websocketUrl;private Integer connectTimeout; // 重连延迟,单位:毫秒private String msg;private IMonWebsocketService monWebsocketService;private String status = "";private volatile Integer reconnectTimes = 0;@OnOpenpublic void onOpen(Session session) {this.session = session;//System.out.println("WebSocket 连接已打开");reconnectTimes = 0;}@OnMessagepublic void onMessage(String message) {//System.out.println("接收到消息: " + message);if(StringUtils.isBlank(msg)||"#".equals(msg)){reconnectTimes = 0;}else{if(StringUtils.isNotBlank(message)&&message.equals(msg)){reconnectTimes = 0;}}}@OnClosepublic void onClose() {//System.out.println("WebSocket 连接已关闭");
//        latch.countDown();closeStatus();}@OnErrorpublic void onError(Throwable error) {//System.out.println("WebSocket 错误: " + error.getMessage());
//        latch.countDown();closeStatus();}public void connect(String websocketUrl) {ClientManager client = ClientManager.createClient();
//        latch = new CountDownLatch(1);try {client.connectToServer(this, new URI(websocketUrl));
//            latch.await(); // 等待 WebSocket 连接建立完成} catch (Exception e) {//System.out.println("无法连接到 WebSocket 服务器: " + e.getMessage());closeStatus();}}public void close() {closeStatus();try {session.close();} catch (Exception e) {//System.out.println("无法关闭 WebSocket 连接: " + e.getMessage());}finally {
//            latch.countDown();}}//    private CountDownLatch latch = new CountDownLatch(1);private void closeStatus(){if(!"close".equals(status)) {//System.out.println("close-update base");monWebsocketService.updateMonWebsocketStatus(websocketId, Status.CLOSE);status = "close";reconnectTimes = connectTimeout/1000 + 1;}}public WebSocketThread(Long websocketId, String websocketUrl, Integer connectTimeout, String msg, IMonWebsocketService monWebsocketService){this.websocketId = websocketId;this.websocketUrl = websocketUrl;this.connectTimeout = connectTimeout;this.msg = msg;this.monWebsocketService = monWebsocketService;}public void stopThread() {running = false;
//        latch.countDown();}public void run() {
//        String websocketUrl = "ws://127.0.0.1:8000/websocket/message"; // 替换为你要测试的 WebSocket 地址//        WebSocketClient client = new WebSocketClient();while (running) {connect(websocketUrl);out:while (running){try {Thread.sleep(1000);reconnectTimes++;//System.out.println("reconnectTimes*1000:"+reconnectTimes*1000);if(reconnectTimes*1000>connectTimeout){//收到消息的心跳间隔大于设置的时间//System.out.println("close");closeStatus();reconnectTimes --;if (session == null||!session.isOpen()) break out;}else{//System.out.println("open");if(!"open".equals(status)) {//System.out.println("open-update base");monWebsocketService.updateMonWebsocketStatus(websocketId, Status.OPEN);status = "open";}}} catch (InterruptedException e) {throw new RuntimeException(e);}}close();try {Thread.sleep(5000);} catch (InterruptedException e) {throw new RuntimeException(e);}}}}


http://wed.xjx100/news/254918.html

相关文章

微信小程序node+vue医院挂号预约系统fun17

从而实现管理员后端;首页、个人中心、用户管理、专家管理、科室类型管理、职称类型管理、医院挂号管理、挂号信息管理、留言板管理、系统管理,专家后端;首页、个人中心、医院挂号管理、挂号信息管理、系统管理,用户前端&#xff1…

14-Vue3快速上手

目录 1.Vue3简介2. Vue3带来了什么2.1 性能的提升2.2 源码的升级2.3 拥抱TypeScript2.4 新的特性 1、海贼王,我当定了!——路飞 2、人,最重要的是“心”啊!——山治 3、如果放弃,我将终身遗憾。——路飞 4、人的梦想是…

[201602][Wireshark 网络分析的艺术][林沛满][著]

[201602][Wireshark 网络分析的艺术][林沛满][著] Wireshark Go Deep. https://www.wireshark.org/ GitHub - wireshark/wireshark: Read-only mirror of Wireshark’s Git repository at https://gitlab.com/wireshark/wireshark. GitHub won’t let us disable pull requ…

《Kali渗透基础》05. 主动信息收集(二)

kali渗透 1:端口扫描2:UDP 扫描2.1:Scapy2.2:nmap 3:半开放扫描3.1:Scapy3.2:nmap3.3:hping3 4:全连接扫描4.1:Scapy4.2:nmap4.3:dmit…

Hugging News #0602: Transformers Agents 介绍、大语言模型排行榜发布!

每一周,我们的同事都会向社区的成员们发布一些关于 Hugging Face 相关的更新,包括我们的产品和平台更新、社区活动、学习资源和内容更新、开源库和模型更新等,我们将其称之为「Hugging News」,本期 Hugging News 有哪些有趣的消息…

解决一个典型的商业案例研究任务

介绍 印尼的一家公司 Gojek 通过移动应用程序提供运输和物流、食品和购物、支付、日常需求、商业、新闻和娱乐等服务,对经济做出了超过70亿美元的贡献。 它拥有 90 万注册商户、超过 1.9 亿次应用下载以及超过 200 万名司机能够在120分钟内完成超过18万个订单。我们…

chatgpt赋能python:Python创建界面的重要性及实现方法

Python创建界面的重要性及实现方法 作为一名有10年Python编程经验的工程师,我深知Python在Web开发、数据分析和人工智能等方面的强大表现。然而,Python对于前端的支持一直是一个不被关注的领域。 随着网站、移动应用和电脑软件的普及,用户对…

Java网络编程-API监测

实现一个用于监测 API 接口可用性的线程类,其作用是通过发送 HTTP 请求到指定的 API 接口,并监测接口的可用性。 代码中的 APIThread 类继承自 Thread,意味着它可以在单独的线程中执行。 在 run 方法中,使用 HttpURLConnection …