java 实现websocket当客户端连接服务器以及自动重连的方式

不是项目用到了 也不会去研究这个东西 首先引入jar包 目前的最新版本是1.5.2

GetHub源码地址:GitHub - TooTallNate/Java-WebSocket: A barebones WebSocket client and server implementation written in 100% Java.

        <dependency>
            <groupId>org.java-websocket</groupId>
            <artifactId>Java-WebSocket</artifactId>
            <version>1.5.2</version>
        </dependency> 

 

首先是websocket的搭建 这个可以说是非常简单的了 直接上代码 没啥好说的 

package com.config;
import org.java_websocket.client.WebSocketClient;
import org.java_websocket.handshake.ServerHandshake;
import org.springframework.beans.factory.annotation.Autowired;

import java.net.URI;
public class MyWebSocketClient extends WebSocketClient {public static boolean WEBSTATUS = false;

  //连接
public MyWebSocketClient(URI serverUri) { super(serverUri); }
  //打开连接 @Override
public void onOpen(ServerHandshake serverHandshake) { WEBSTATUS = true; } @Override public void onMessage(String s) { //接收消息 } @Override public void onClose(int i, String s, boolean b) { WEBSTATUS = false;
     //重连
     ReconnectThreadEnum.getInstance().reconnectWs(this);
  }

    @Override
    public void onError(Exception e) {
        WEBSTATUS = false;
    }
  
  //推送消息
public void sendMsg(String msg){ if(WEBSTATUS){
      
send(msg);
    }
}

}

这里面有个参数  WEBSTATUS  这个是用来记录当前websocket的状态的 因为是作为客户端 就不考虑多个的问题

然后 就是重点了 自动重连 

package com.jinfu.sdkdemo.config;

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public enum ReconnectThreadEnum {

WebSocketInstance(){
@Override
public void reconnectWs(MyWebSocketClient demoWebSocketClient) {
cachedThreadPool.execute(new Runnable() {
@Override
public void run() {
try {
//重连间隔一秒
Thread.sleep(1000);
System.out.println("重新连接");
} catch (InterruptedException e) {
e.printStackTrace();
}
demoWebSocketClient.reconnect();
}
});
}
};

private static final ExecutorService cachedThreadPool = Executors.newCachedThreadPool();

public abstract void reconnectWs(MyWebSocketClient demoWebSocketClient);

public static ReconnectThreadEnum getInstance(){
return WebSocketInstance;
}
}

初始化 WebSocketClient对象

package com.jinfu.sdkdemo.config;

import org.java_websocket.client.WebSocketClient;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.env.Environment;
import org.springframework.util.StringUtils;

import java.net.URI;
import java.net.URISyntaxException;

@Configuration
public class TestBean {

    @Autowired
    public Environment env;

    @Bean
    public WebSocketClient webServiceClient() {
        try {
            MyWebSocketClient mWebSocketClient = new MyWebSocketClient(new URI(StringUtils.hasLength(env.getProperty("websocket.url"))?env.getProperty("websocket.url"):"ws://127.0.0.1:8080/websocket"));
            mWebSocketClient.connect();
            return mWebSocketClient;
        } catch(URISyntaxException e){
            e.printStackTrace();
        }
        return null;
    }
}

到这里 完结 

posted @ 2022-01-24 15:29  资深CURD小白程序猿  阅读(3074)  评论(0编辑  收藏  举报