springboot下后端模拟websocket客户端

写在前面

需求场景

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

源码地址

一定看readme!!一定看readme!!一定看readme!!

引用

        <!-- 后端模拟前端监听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);
    }
}
  • 1
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值