websocket也是第一次接触,对于日新月异的技术来说,也不是特别新颖的技术,只是工作中很少接触到,从慢慢的学习中可以看出,这个websocket大多数是在前端页面直接使用的,实时返回数据,而且基本没有什么限制,而作为java后台使用的过程中,倒是发现了一些问题,如果服务端返回的数据量过大,会出现接收不全的现象(ps:这个目前没有解决,不知道是自身的限制还是没找到办法,页面使用没有这个问题),既然头一次使用,不记录那是不对滴。。。
引入WebSocketClient:
<dependency>
<groupId>org.java-websocket</groupId>
<artifactId>Java-WebSocket</artifactId>
<version>1.3.9</version>
</dependency>
package com.config.websocket;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import lombok.extern.slf4j.Slf4j;
import org.java_websocket.WebSocket;
import org.java_websocket.client.WebSocketClient;
import org.java_websocket.handshake.ServerHandshake;
import org.springframework.beans.factory.annotation.Autowired;
import java.net.URI;
/**
* @author Administrator
*/
@Slf4j
public class MyWebSocketClient extends WebSocketClient {
public MWebSocketClient(URI serverUri) {
super(serverUri);
}
@Override
public void onOpen(ServerHandshake arg0) {
log.info("------ MyWebSocket onOpen ------");
}
@Override
public void onClose(int arg0, String arg1, boolean arg2) {
log.info("------ MyWebSocket onClose ------{}", arg1);
//有时候不起作用
if (arg2){
reconnect();
}
}
@Override
public void onError(Exception arg0) {
log.info("------ MyWebSocket onError ------{}", arg0);
//有时候不起作用,其他地方有重启
if (getReadyState().equals(WebSocket.READYSTATE.CLOSING) || getReadyState().equals(WebSocket.READYSTATE.CLOSED)) {
reconnect();
}
}
@Override
public void onMessage(String arg0) {
log.info("-------- 接收到服务端数据: " + arg0 + "--------");
//这里可以做一些逻辑操作
}
}
放入容器中:
package com.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 java.net.URI;
import java.net.URISyntaxException;
/**
* websocket放入容器
* @author Administrator
*/
@Configuration
public class WebsocketConfig {
@Autowired
private TempServerConfigService tempServerConfigService;
@Bean
public WebSocketClient webServiceClient() throws URISyntaxException {
MWebSocketClient mWebSocketClient = new MWebSocketClient(new URI("ws://127.0.0.1:8888/MonitorBridge"));
//由于业务原因,这里没有启动,地址是动态获取的
//mWebSocketClient.connect();
return mWebSocketClient;
}
}
使用websocketclient,这里是连接:
@Autowired
private WebSocketClient webSocketClient;
@Override
public void runWebsocketBean(String url) {
if (null == webSocketClient){
return;
}
if (!webSocketClient.isOpen()){
if (webSocketClient.getReadyState().equals(WebSocket.READYSTATE.NOT_YET_CONNECTED)){
try {
webSocketClient.connect();
} catch (IllegalStateException e) {
log.error("msg is :"+e);
}
} else if (webSocketClient.getReadyState().equals(WebSocket.READYSTATE.CLOSING) || webSocketClient.getReadyState().equals(WebSocket.READYSTATE.CLOSED)) {
webSocketClient.reconnect();
}
}
}
注:由于头一次使用,不知道是服务端问题还是后台的问题,使用过程中会出错或断开连接,这就需要发送指令之前先查看是否启动连接,如果没有要先连接然后进行操作,就暂时做了一个小处理,目前还可以解决问题
if (!webSocketClient.isOpen()){
//如果没有启动,则先启动,等待4秒,再执行操作
runWebsocketBean("");
Thread.sleep(1000 * 4);
}
webSocketClient.send(s);
版权声明:本文为BinshaoNo_1原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。