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); } }
下一篇:
Golang生成、识别二维码与条形码