Java WebSocket客户端
https://www.cnblogs.com/SjhCode/p/WebSocketClient.html
注意事项:
1.@Scheduled(fixedDelay = 5000)
2.心跳检测
3.导入依赖与导包
<dependency> <groupId>org.java-websocket</groupId> <artifactId>Java-WebSocket</artifactId> <version>1.5.2</version> </dependency>
import org.java_websocket.client.WebSocketClient;
import org.java_websocket.handshake.ServerHandshake;
以下这个类直接复制就可以
/**
* @author jianhan
* @Description: WebsocketClient客户端
* @date 2022/11/7 16:56
*/
public class WebsocketClient extends WebSocketClient {
private static Logger logger = LoggerFactory.getLogger(WebsocketClient.class);
public WebsocketClient(URI url) {
super(url);
}
@Override
public void onOpen(ServerHandshake shake) {
logger.info("握手...");
for(Iterator<String> it = shake.iterateHttpFields(); it.hasNext();) {
String key = it.next();
logger.info(key+":"+shake.getFieldValue(key));
}
}
@Override
public void onMessage(String paramString) {
logger.info("接收到消息:"+paramString);
//以下为业务逻辑处理
SocketClient socketClient = new SocketClient();
socketClient.message(paramString);
}
@Override
public void onClose(int paramInt, String paramString, boolean paramBoolean) {
logger.info("关闭...");
}
@Override
public void onError(Exception e) {
logger.error("异常"+e);
}
}
第二个类,逻辑处理
/**
* @author jianhan
* @Description: WebsocketClient客户端
* @date 2022/11/7 17:02
*/
@Component
public class SocketClient {
private static Logger logger = LoggerFactory.getLogger(SocketClient.class);
@Resource
private WebSocket webSocket;
/**
* @Description: 客户端建立连接
* @Param:
* @return:
* @Author: jianhan
* @Date: 2022-11-08 09:58:57
**/
@Scheduled(fixedDelay = 5000)
public static void client() {
try {
WebsocketClient myClient = new WebsocketClient(new URI("ws://127.0.0.1:8001/webSocket"));
myClient.connect();
if (!myClient.getReadyState().equals(ReadyState.OPEN) && !myClient.isOpen()) {
System.out.println("连接中。。。");
Thread.sleep(1000 * 5);
}
// 连接成功往websocket服务端发送数据
myClient.send("初始化连接成功");
healthCheck(myClient);//心跳检测
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* @Description: 心跳检测
* @Param:
* @return:
* @Author: jianhan
* @Date: 2022-11-11 09:20:03
**/
public static void healthCheck(WebsocketClient websocketClient) {
try {
while (true) {
logger.info("进入心跳检测");
if (websocketClient.getReadyState().equals(ReadyState.OPEN)) {
websocketClient.send("ping");
try {
Thread.sleep(1000 * 60 * 20);
} catch (InterruptedException e) {
e.printStackTrace();
}
} else {
websocketClient.connect();
}
}
} catch (Exception e) {
logger.error("客户端心跳消息发送异常");
e.printStackTrace();
}
}
/**
* @Description: 处理接收的数据
* @Param: message
* @return:
* @Author: jianhan
* @Date: 2022-11-07 17:36:49
**/
public void message(String message) {
logger.info("message:" + message);
String string = JSON.toJSONString(message);
Map map = (Map) JSON.parse(string);
//以下业务代码
}
}
以下为选择复制
4.websocket本身有重连机制,设置心跳检测可以延缓时间,可以不设置心跳检测,不过在client()中要if要改为while,并且在while中调client()。
while (!myClient.getReadyState().equals(ReadyState.OPEN) && !myClient.isOpen()) {
System.out.println("连接中。。。");
Thread.sleep(1000 * 5);
client()
}

浙公网安备 33010602011771号