vue3 实现websocket心跳基础代码

话不多说 直接看代码

<script setup lang="ts">
onMounted(() => {
  createWebSocket()   // 创建socket连接
  init() // 初始化
  if (heartConnet.value) clearInterval(heartConnet.value)
  heartConnet.value = setInterval(() => {
    createWebSocket()
    init()
  }, 60000)
})

// 建立webscoked连接
function createWebSocket() {
  try {
    socket = new WebSocket(
      `ws://${location.host}/wsUrl/myHandler/`
    )
  } catch (e) {
    reconnect()
  }
}

var socket: any = null    // socket对象
let heartConnet: any = ref(null) //连续一分钟心跳
let lockReconnect = false //避免重复连接
let tt: any = null

function init() {
  socket.onclose = () => {
    // 连接已关闭
    createWebSocket()    // 重新连接
  }
  socket.onerror = (_error: any) => {
    // 连接报错
    createWebSocket()    // 重新连接
  }
  socket.onopen = () => {
    console.log('websocket open')
  }
  socket.onmessage = (_event: any) => {
    let res = JSON.parse(_event.data)
    // 收到消息
    }
  }
}

function reconnect() {
  if (lockReconnect) {
    return
  }
  lockReconnect = true
  //没连接上会一直重连,设置延迟避免请求过多
  tt && clearTimeout(tt)
  tt = setTimeout(function () {
    createWebSocket()
    lockReconnect = false
  }, 2000)
}
</script>

实现WebSocket心跳机制,可以在客户端和服务端都实现一个定时发送ping消息和接收pong消息的逻辑。以下是使用SpringBoot和Vue3实现WebSocket心跳机制的示例代码: 服务端(SpringBoot): ```java @Configuration @EnableWebSocket public class WebSocketConfig implements WebSocketConfigurer { @Override public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) { registry.addHandler(myHandler(), "/myHandler").setAllowedOrigins("*"); } @Bean public WebSocketHandler myHandler() { return new MyHandler(); } private class MyHandler extends TextWebSocketHandler { private static final int HEARTBEAT_INTERVAL = 30 * 1000; // 心跳间隔,单位为毫秒 private ScheduledExecutorService executor = Executors.newSingleThreadScheduledExecutor(); private ScheduledFuture<?> heartbeatFuture; @Override public void afterConnectionEstablished(WebSocketSession session) { startHeartbeat(session); } @Override public void handleTextMessage(WebSocketSession session, TextMessage message) { // 处理普通消息 } @Override public void handleTransportError(WebSocketSession session, Throwable exception) { stopHeartbeat(); } @Override public void afterConnectionClosed(WebSocketSession session, CloseStatus status) { stopHeartbeat(); } private void startHeartbeat(WebSocketSession session) { stopHeartbeat(); // 先停止之前可能存在的心跳任务 heartbeatFuture = executor.scheduleAtFixedRate(() -> { try { session.sendMessage(new TextMessage("ping")); } catch (IOException e) { stopHeartbeat(); } }, HEARTBEAT_INTERVAL, HEARTBEAT_INTERVAL, TimeUnit.MILLISECONDS); } private void stopHeartbeat() { if (heartbeatFuture != null) { heartbeatFuture.cancel(true); } } } } ``` 客户端(Vue3): ```javascript const HEARTBEAT_INTERVAL = 30 * 1000; // 心跳间隔,单位为毫秒 const ws = new WebSocket('ws://localhost:8080/myHandler'); ws.onopen = () => { startHeartbeat(); }; ws.onmessage = (event) => { if (event.data === 'pong') { // 收到心跳回复 } else { // 处理普通消息 } }; ws.onerror = () => { stopHeartbeat(); }; ws.onclose = () => { stopHeartbeat(); }; let heartbeatTimer; function startHeartbeat() { stopHeartbeat(); // 先停止之前可能存在的心跳任务 heartbeatTimer = setInterval(() => { ws.send('ping'); }, HEARTBEAT_INTERVAL); } function stopHeartbeat() { if (heartbeatTimer != null) { clearInterval(heartbeatTimer); } } ``` 在上面的示例中,服务端使用了SpringBoot的WebSocket支持,客户端使用了Vue3的WebSocket API。服务端和客户端都实现了一个定时发送ping消息和接收pong消息的逻辑,以确保WebSocket连接的正常运行。注意,如果服务端或客户端在发送或接收消息时出现异常,应该立即停止心跳任务,以避免对服务器造成过大的负担。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值