WebSocket加入心跳包防止自动断开连接

近日,在公司中开发一个使用websocket为前端推送消息的功能时,发现一个问题:就是每隔一段时间如果不传送数据的话,与前段的连接就会自动断开;

刚开始以为是session的原因,因为web session 的默认时间是30分钟;但是通过日志发现断开时间间隔时间远远不到30分钟;认真分析发现不操作间隔恰好为90秒

它就会在自动断开;随恍然大悟;原来是我们的使用nginx 代理,nginx配置了访问超时时间为90s;

WebSocket是html5中用来实现长连接的一个协议。
在同时使用nginx反向代理和websocket的时候,因为websocket的通信管道必须都要一直处于开启状态。

proxy_read_timeout 90;

解决方案:

1. 修改nginx配置
nginx 通过在客户端和后端服务器之间建立起一条隧道来支持WebSocket。
为了使nginx可以将来自客户端的Upgrade请求发送给后端服务器,Upgrade和Connection的头信息必须被显式的设置。如下所示:

location /web/count {
        proxy_pass http://tomcat-server;
        proxy_redirect off;
        proxy_http_version 1.1;

        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connect
  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 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、付费专栏及课程。

余额充值