SpringBoot + Vue + WebSocket简单用法

WebSocket 使得客户端和服务器之间的数据交换变得更加简单,允许服务端主动向客户端推送数据。在 WebSocket API 中,浏览器和服务器只需要完成一次握手,两者之间就直接可以创建持久性的连接,并进行双向数据传输。避免了Ajax 轮询,节约了很多的带宽等资源。

1、引入Maven依赖 pom.xml
// 如果本地依赖存在但是报红,加上版本号
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-websocket</artifactId>
</dependency>
2、配置类 WebSocketConfig.java
@Configuration
public class WebSocketConfig {
    @Bean
    public ServerEndpointExporter serverEndpointExporter(){
        return new ServerEndpointExporter();
    }
}
3、处理类 WebSocketController.java
@Component
@ServerEndpoint("/webSocket/{userCode}")
public class WebSocketController {

    private static final Log logger = LogFactory.getLog(WebSocketController.class);

    private static ConcurrentHashMap<String, Session> userInfoMap = new ConcurrentHashMap<>();
    private static int onlineCount = 0;

    /**
     * 发送消息
     * @param userCode
     * @param message
     */
    @OnMessage
    public void onMessage(@PathParam("userCode") String userCode, String message) {
        try {
            // 向指定用户发送消息
            userInfoMap.get(userCode).getBasicRemote().sendText(message);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    /**
     * 建立连接调用的方法
     * @param session
     * @param userCode
     */
    @OnOpen
    public void onOpen(Session session, @PathParam("userCode") String userCode) {
        userInfoMap.put(userCode, session);
        onlineCount = userInfoMap.size();
        logger.info("建立连接成功,当前人数为" + onlineCount);
        String message = "建立连接成功,当前人数为" + onlineCount;
        onMessage(userCode, message);
    }
    
    /**
     * 关闭链接调用接口
     * @param userCode
     */
    @OnClose
    public void onClose(@PathParam("userCode") String userCode) {
        userInfoMap.remove(userCode);
        onlineCount = userInfoMap.size();
        logger.info("断开连接成功,当前人数为" + onlineCount);
    }

}
4、Vue
mounted () {
    this.initWebSocket()
},
destroyed () {
    this.webSocketClose()
},
methods: {
    initWebSocket () {
        console.log('initWebSocket方法')
        // 根据自己的方法获取userCode
        let userCode = sessionStorage.getItem('userCode')
        // WebSocket地址为接口地址,http用ws、https用wws
        // var ws_scheme = window.location.protocol == "https:" ? "wss" : "ws"
        this.websocket = new WebSocket('ws://localhost:8580/webSocket/' + userCode)
        this.websocket.onopen = this.webSocketOpen
        this.websocket.onerror = this.webSocketError
        this.websocket.onmessage = this.webSocketMessage
        this.websocket.onclose = this.webSocketClose
    },
    webSocketOpen () {
        console.log('WebSocket连接成功')
    },
    webSocketError () {
        console.log('WebSocket连接错误')
    },
    webSocketMessage (e) {
        // 接收服务器返回的数据
        console.log('服务器返回的消息', e.data)
    },
    webSocketClose (e) {
        console.log('WebSocket连接断开', e)
    }
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容