java 心跳包 报文格式_websocket+心跳包

菜鸟教程(runoob.com)

function WebSocketTest()

{

if ("WebSocket" in window)

{

alert("您的浏览器支持 WebSocket!");

// 打开一个 web socket

var ws = new WebSocket("ws://localhost:9998/echo");

ws.onopen = function()

{

// Web Socket 已连接上,使用 send() 方法发送数据

ws.send("发送数据");

alert("数据发送中...");

};

ws.onmessage = function (evt)

{

var received_msg = evt.data;

alert("数据已接收...");

};

ws.onclose = function()

{

// 关闭 websocket

alert("连接已关闭...");

};

}

else

{

// 浏览器不支持 WebSocket

alert("您的浏览器不支持 WebSocket!");

}

}

运行 WebSocket

上面一段是菜鸟代码,但是要清楚websocket是前后端交互的长连接,前后端也都可能因为一些情况导致连接失效并且相互之间没有反馈提醒。因此为了保证连接的可持续性和稳定性,websocket心跳重连就应运而生。

以下是我自己项目的代码,不要在意内容,在意形式就好,里面掺杂着心跳包插件。

var ws;

var wsUrl="ws://"+window.location.host+"/mss/h5WebSocket";

var lockReconnect = false;//避免重复连接的开关

var tempTrainAlarm={};

function createWebSocket(url)

{

try{

ws=new WebSocket(url);

initEventHandle();

}

catch(e){

reconnect(url);

}

};

function initEventHandle()

{

ws.onclose=function(){

reconnect(wsUrl);

};

ws.οnerrοr=function(){

reconnect(wsUrl);

};

ws.open=function(){

heartCheck.reset();

}

ws.onmessage=function(message){

if(message.data!=="HeartBeat")

{

var outerData=JSON.parse(message.data);

if(outerData.websocketType=="logout")//实际这一步不太需要,如果报文发不过来这一条也能保证执行而已,下面已经有了

{

window.location.href="/mss/h5/login.html";

}

var dataStr=outerData.msg.toString();//这一步是从message里的data的msg转成字符串

var data=JSON.parse(dataStr);//将字符串转换成对象

if(outerData.websocketType=="tab")

{

tabSession[0] = data;

// tab_interval_off = true;

}

else if(outerData.websocketType=="mqFtp")

{

mqFtpSession[0] = data;

}

else if(outerData.websocketType=="alarmList")

{

alarmListSession.push(data);

}

else if(outerData.websocketType=="logout")

{

window.location.href="/mss/h5/login.html";

}

else if(outerData.websocketType=="SwitchValueList")

{

SwitchValueListSession.push(data);

}

else if(outerData.websocketType=="VobcTrainOnLine")

{

VobcTrainOnLineSession[0] = data;

// vobc_interval_off = true;

}

else if(outerData.websocketType=="WEBSOCKET_AXLE_SECTION_RESET_TYPE")

{

axleSession.push(data);

}

else if(outerData.websocketType=="WEBSOCKET_LTE_ALARM_TYPE")

{

lteSession.push(data);

}

else if(outerData.websocketType=="WEBSOCKET_LTE_ALARM_TAB_TYPE")

{

lteTabSession[0] = data;

}

else console.log("多了一种websocketType");

}

heartCheck.reset();

}

};

function reconnect(url)

{

if(lockReconnect) return;

lockReconnect = true;

//没连接上会一直重连,设置延迟避免请求过多

setTimeout(function () {

createWebSocket(url);

lockReconnect = false;

}, 2000);

}

var heartCheck = {

timeout: 60000,//60s

timeoutObj: null,

serverTimeoutObj: null,

reset: function(){

clearTimeout(this.timeoutObj);

clearTimeout(this.serverTimeoutObj);

this.start();

},

start: function(){

var self = this;

this.timeoutObj = setTimeout(function(){

ws.send("HeartBeat");

self.serverTimeoutObj = setTimeout(function(){

ws.close();//如果onclose会执行reconnect,我们执行ws.close()就行了.如果直接执行reconnect 会触发onclose导致重连两次

}, self.timeout)

}, this.timeout)

},

};

createWebSocket(wsUrl);

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java 中使用 WebSocket 发送心跳包可以通过以下步骤实现: 1. 创建一个定时器,在一定的时间间隔内发送心跳包。 2. 在 WebSocket 连接建立时启动定时器。 3. 在定时器中发送一个特定的消息,表示心跳包。 下面是一个简单的示例代码,用于在 Java 中使用 WebSocket 发送心跳包: ```java import javax.websocket.*; import java.net.URI; import java.util.Timer; import java.util.TimerTask; @ClientEndpoint public class WebSocketClient { private Timer timer; @OnOpen public void onOpen(Session session) { System.out.println("WebSocket connected!"); // 启动定时器,每隔一段时间发送心跳包 timer = new Timer(); timer.schedule(new HeartbeatTask(session), 0, 5000); } @OnMessage public void onMessage(String message) { System.out.println("Received message: " + message); } @OnError public void onError(Throwable throwable) { System.out.println("Error: " + throwable.getMessage()); } @OnClose public void onClose() { System.out.println("WebSocket closed!"); } private static class HeartbeatTask extends TimerTask { private final Session session; public HeartbeatTask(Session session) { this.session = session; } @Override public void run() { try { System.out.println("Sending heartbeat message..."); session.getBasicRemote().sendText("heartbeat"); } catch (Exception ex) { ex.printStackTrace(); } } } public static void main(String[] args) throws Exception { WebSocketContainer container = ContainerProvider.getWebSocketContainer(); container.connectToServer(WebSocketClient.class, new URI("ws://localhost:8080/ws")); } } ``` 在上面的示例代码中,我们创建了一个 `WebSocketClient` 类,用于与 WebSocket 服务器进行通信。在 `onOpen` 方法中,我们启动了一个定时器,并设置定时器每隔 5 秒发送一个心跳包。在 `HeartbeatTask` 类中,我们定义了发送心跳包的具体实现。最后,在 `main` 方法中,我们使用 `WebSocketContainer` 来连接到 WebSocket 服务器。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值