springboot下后端模拟websocket客户端

写在前面

需求场景

一般来说项目中使用到websocket服务,都是由后端实现服务端,前端实现客户端(致歉:曾经有个项目 由于是外包,那么我服务端也是让前端自己写的,不因为其他只是因为我懒),老话说:出来写代码,总是要还的。 那么当前项目有一个需求如下: 我们需要接一个三方的数据, 这个三方年代久远, 后端与后端的数据交互,他是用的是websocket,那么我们现在就需要在后端实现客户端代码。

引用

<!-- 后端模拟前端监听websocket -->
        <dependency>
            <groupId>org.java-websocket</groupId>
            <artifactId>Java-WebSocket</artifactId>
            <version>1.5.2</version>
        </dependency>

实现

第一步 引入依赖

<!-- 后端模拟前端监听websocket -->
        <dependency>
            <groupId>org.java-websocket</groupId>
            <artifactId>Java-WebSocket</artifactId>
            <version>1.5.2</version>
        </dependency>

第二步 实现客户端监听功能

package com.lylbp.manager.websocket.client;

import com.google.protobuf.InvalidProtocolBufferException;
import com.lylbp.manager.websocket.PersonBean;
import lombok.extern.slf4j.Slf4j;
import org.java_websocket.client.WebSocketClient;
import org.java_websocket.enums.ReadyState;
import org.java_websocket.handshake.ServerHandshake;

import javax.annotation.PostConstruct;
import java.net.URI;

@Slf4j
public class MyWebSocketClient extends WebSocketClient {
          
   
    public MyWebSocketClient(URI uri) {
          
   
        super(uri);
    }

    @PostConstruct
    private void init() {
          
   
        try {
          
   
            this.connectBlocking();
            //开启心跳重连线程
            new Thread(() -> {
          
   
                while (true) {
          
   
                    try {
          
   
                        //当连接状态不为open时每5秒重连一次
                        if (getReadyState() != ReadyState.OPEN) {
          
   
                            reconnectBlocking();
                            Thread.sleep(5 * 1000);
                        }
                    } catch (InterruptedException e) {
          
   
                        e.printStackTrace();
                    }
                }
            }).start();
        } catch (InterruptedException e) {
          
   
            throw new RuntimeException(e);
        }
    }

    @Override
    public void onOpen(ServerHandshake serverHandshake) {
          
   
        heartCheck();
        log.info("与云服务器成功建立WS连接");
    }

    @Override
    public void onMessage(String s) {
          
   
        heartCheck();
        log.info("-------- 接收到服务端数据: " + s + "--------");
        send("发送一个心跳成功");
    }

    @Override
    public void onClose(int code, String reason, boolean remote) {
          
   
        log.warn("readyState:" + getReadyState() + "," + code + "-reason:" + reason + ",与云服务器断开了连接,尝试重连...");
    }

    @Override
    public void onError(Exception e) {
          
   
        log.error("webSocket发生异常: {}:{}", e.getClass().getName(), e.getMessage());
        close();
    }

    public void heartCheck() {
          
   
        if (getReadyState() == ReadyState.OPEN) {
          
   
            send("....发送一个心跳.....");
        }
    }
}

第三步 注入客户端

@Configuration
public class WebSocketConfig {
          
   
    /**
     * 后端模拟websocket客户端
     *
     * @return MyWebSocketClient
     */
    @Bean
    public MyWebSocketClient myWebSocketClient() {
          
   
        String wsUrl = "ws://192.168.150.129:8073/websocket/1624928718196-web-B-1-";
        URI uri = URI.create(wsUrl);
        return new MyWebSocketClient(uri);
    }
}
经验分享 程序员 微信小程序 职场和发展