Java网络Socket编程-websocket

这篇具有很好参考价值的文章主要介绍了Java网络Socket编程-websocket。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

实现一个用于监测 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,这些类和接口在代码中没有给出具体实现。因此,要使代码正常运行,需要确保相关的类和接口已经正确实现,并且适配于你的应用程序环境文章来源地址https://www.toymoban.com/news/detail-480369.html

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;


    @OnOpen
    public void onOpen(Session session) {
        this.session = session;
        //System.out.println("WebSocket 连接已打开");
        reconnectTimes = 0;
    }

    @OnMessage
    public 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;
            }
        }
    }

    @OnClose
    public void onClose() {
        //System.out.println("WebSocket 连接已关闭");
//        latch.countDown();
        closeStatus();
    }

    @OnError
    public 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);
            }
        }


    }

}

到了这里,关于Java网络Socket编程-websocket的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 网络编程-Socket通信实现服务器与客户端互传文件(JAVA语言实现)

    在网络通信协议下,实现网络互连的不同计算机上运行的程序间可以进行数据交换. 网络编程三要素:ip地址、端口、协议 ip地址: 每台计算机指定的一个标识符,127.0.0.1是回送地址,可以代表本机地址 ,一般用来测试使用 ipconfig:命令行中查看本机地址 ping ip地址:检查网络是

    2023年04月14日
    浏览(47)
  • 网络编程之 Socket 套接字(使用数据报套接字和流套接字分别实现一个小程序(附源码))

    网络编程是指网络上的主机,通过不同的进程,以编程的方式实现 网络通信(或称为网络数据传输) 只要满足不同的进程就可以进行通信,所以即便是在同一个主机,只要不同的进程,基于网络传输数据,也属于网络编程 在一次网络传输中: 发送端: 数据的 发送方进程

    2024年02月03日
    浏览(63)
  • 【Java】网络编程与Socket套接字、UDP编程和TCP编程实现客户端和服务端通信

    为什么需要网络编程? 现在网络普及程序越来越高,网络上保存着我们日常生活中需要的各种资源,使用程序通过网络来获取这些资源的过程就需要网络编程来实现。 什么是网络编程? 网络编程,指网络上的主机,通过不同的进程以程序的方式实现网络通信(网络数据传输)

    2024年02月17日
    浏览(79)
  • 【Java网络编程】基于UDP-Socket 实现客户端、服务器通信

    ​ 哈喽,大家好~我是你们的老朋友: 保护小周ღ   本期为大家带来的是网络编程的 UDP Socket 套接字,基于 UDP协议的 Socket 实现客户端服务器通信 ,Socket 套接字可以理解为是,传输层给应用层提供的一组 API,如此程序,确定不来看看嘛~~ 本期收录于博主的专栏 : JavaEE_保

    2024年02月02日
    浏览(71)
  • Java网络编程-API监测

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

    2024年02月08日
    浏览(39)
  • Java【网络编程2】使用 TCP 的 Socket API 实现客户端服务器通信(保姆级教学, 附代码)

    📕各位读者好, 我是小陈, 这是我的个人主页 📗小陈还在持续努力学习编程, 努力通过博客输出所学知识 📘如果本篇对你有帮助, 烦请点赞关注支持一波, 感激不尽 📙 希望我的专栏能够帮助到你: JavaSE基础: 基础语法, 类和对象, 封装继承多态, 接口, 综合小练习图书管理系统

    2024年02月05日
    浏览(65)
  • 【你的第一个socket应用】Vue3+Node实现一个WebSocket即时通讯聊天室

    这篇文章主要是用WebSocket技术实现一个 即时通讯聊天室 ,首先先要了解为什么使用WebSocket而不是普通的HTTP协议,如果使用HTTP协议它是下面这种情况: 我发送一条消息,发送一个发送消息的请求;* 一直轮询接收别人发送的消息,不管有没有发送都要定时去调用接口。这里明

    2023年04月20日
    浏览(63)
  • Java 网络编程 —— Socket 详解

    在【客户端/服务端】的通信模式中,客户端需要主动构造与服务器连接的 Socket,构造方法有以下几种重载形式: 除了第一个不带参数的构造方法,其他构造方法都会试图建立与服务器的连接,一旦连接成功,就返回 Socket 对象,否则抛出异常 1. 设定等待建立连接的超时时间

    2024年02月01日
    浏览(36)
  • 【网络编程】Java中的Socket

    所谓Socket(套接字),就是对网络中不同主机上的应用进程之间进行双向通信的端点的抽象。一个套接字就是网络上进程通信的一端,提供了应用层进程利用网络协议交换数据的机制。从所处的地位来讲,套接字上联应用进程,下联网络协议栈,是应用程序通过网络协议进行

    2024年02月07日
    浏览(37)
  • Linux下网络编程(3)——socket编程实战,如何构建一个服务器和客户端连接

            经过前几篇的介绍,本文我们将进行编程实战,实现一个简单地服务器和客户端应用程序。 编写服务器程序          编写服务器应用程序的流程如下:         ①、调用 socket()函数打开套接字,得到套接字描述符;         ②、调用 bind()函数将套接字

    2024年02月03日
    浏览(67)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包