写在前面
需求场景
一般来说项目中使用到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);
}
}