websocketclient在Springboot项目中的简单应用

  • Post author:
  • Post category:其他


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 版权协议,转载请附上原文出处链接和本声明。