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

2023年2月5日12:59:51

因为很少有这样作为客户端的使用,但是遇上特殊需求还是要作为客户端使用,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);

  • 作者:RiveGauche
  • 原文链接:https://blog.csdn.net/qq_23945685/article/details/102858913
    更新时间:2023年2月5日12:59:51 ,共 1960 字。