JAVA 实现websocket作为客户端(自动断线重连)

因为很少有这样作为客户端的使用,但是遇上特殊需求还是要作为客户端使用,spring-boot-starter集成的无法实现客户端,直接上代码

pom引入,这里使用的spring boot 其他项目自行下载jar包库

<!--WebSocket核心依赖包-->
		<dependency>
			<groupId>org.java-websocket</groupId>
			<artifactId>Java-WebSocket</artifactId>
			<version>1.3.8</version>
		</dependency>
package com.jwuwb.library.service.websocket;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.jwuwb.library.entity.PositionStation;
import com.jwuwb.library.service.PositionStationService;
import org.java_websocket.WebSocket.READYSTATE;
import org.java_websocket.client.WebSocketClient;
import org.java_websocket.handshake.ServerHandshake;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

import java.net.URI;

/**
 * websocket 建立连接...
 * @author apple
 */
@Component
public class Client {
    private static final Logger logger = LoggerFactory.getLogger(Client.class);

	public static void createConnect() throws Exception{
        WebSocketClient client = new WebSocketClient(new URI(这里是你连接的websocket的地址)) {

            @Override
            public void onOpen(ServerHandshake arg0) {
                logger.info("开始建立链接...");
            }

            @Override
            public void onMessage(String arg0) {
              logger.info("检测到服务器请求...arg0 : " + arg0);
            }

            @Override
            public void onError(Exception arg0) {
                arg0.printStackTrace();
                logger.info("客户端发生错误,即将关闭!");
            }

            @Override
            public void onClose(int arg0, String arg1, boolean arg2) {
                logger.info("客户端已关闭!");
                logger.info("开始尝试重新连接...");
                try {
                    Client.createConnect();
                } catch (Exception e) {
                    e.printStackTrace();
                    logger.info("重新连接失败,请检查网络!");
                }
            }
        };

		client.connect();
		//判断连接状态,
		while (client.getReadyState().equals(READYSTATE.OPEN)) {
			logger. info("成功建立链接!");
		}
	}
}

由于websocket是多例的无法直接注入可以使用:(这里只是个示例,使用静态变量的方式可以实现注入)

public static UserService userService;
@Autowired
public void setService(UserService userService) {
    Client.userService = userService;
}

很简单直接调用

Client.createConnect();
或者@PostConstruct直接项目启动一起启动

2021-01-08:

修复会自动断线bug: 

在连接之前设置client的属性

client.setConnectionLostTimeout(0);
  • 2
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 11
    评论
Java作为WebSocket客户端实现断线重连和心跳机制可以参考以下步骤: 1. 断线重连: 当WebSocket客户端失去连接时,需要重新连接WebSocket服务器。可以通过实现WebSocketListener接口中的onClosed()方法来监听连接关闭事件,然后在该方法中实现重连逻辑。例如: ``` public class MyWebSocketListener extends WebSocketListener { private OkHttpClient client; private Request request; public MyWebSocketListener(OkHttpClient client, Request request) { this.client = client; this.request = request; } @Override public void onClosed(@NotNull WebSocket webSocket, int code, @NotNull String reason) { super.onClosed(webSocket, code, reason); // 当连接关闭时,重新连接WebSocket服务器 client.newWebSocket(request, this); } } ``` 2. 心跳机制: WebSocket客户端需要定时向服务器发送心跳消息,以保持长连接。可以通过定时器实现心跳机制。例如: ``` public class MyWebSocketListener extends WebSocketListener { private OkHttpClient client; private Request request; private Timer timer; public MyWebSocketListener(OkHttpClient client, Request request) { this.client = client; this.request = request; this.timer = new Timer(); } @Override public void onOpen(@NotNull WebSocket webSocket, @NotNull Response response) { super.onOpen(webSocket, response); // 当连接成功建立时,启动心跳定时器 timer.scheduleAtFixedRate(new TimerTask() { @Override public void run() { // 向服务器发送心跳消息 webSocket.send("ping"); } }, 0, 5000); // 每5秒发送一次心跳消息 } @Override public void onClosed(@NotNull WebSocket webSocket, int code, @NotNull String reason) { super.onClosed(webSocket, code, reason); // 当连接关闭时,停止心跳定时器 timer.cancel(); } } ``` 以上是实现WebSocket客户端断线重连和心跳机制的简单示例,具体实现方式可以根据项目需求进行调整。
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值