springboot+vue:实现webScoket(springMVC通用,导的包不一样)

本文介绍如何在SpringBoot项目中结合Vue.js实现WebSocket通信。首先,需要引入Spring Boot的websocket依赖,版本为1.5.4.RELEASE。接着,配置后台的spring MVC以支持WebSocket,详细步骤包括设置相关配置类和处理端点。前端使用Vue.js进行WebSocket连接和消息发送接收。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.导入jar包

compile group: 'org.springframework.boot', name: 'spring-boot-starter-websocket', version:'1.5.4.RELEASE'

2.后台spring

ChatHandshakeInterceptor.java(过滤器)
import java.util.Map;
import org.springframework.http.server.ServerHttpRequest;
import org.springframework.http.server.ServerHttpResponse;
import org.springframework.web.socket.WebSocketHandler;
import org.springframework.web.socket.server.HandshakeInterceptor;
/**
 * websocket 的链接建立是基于 http 握手协议,我们可以添加一个拦截器处理握手之前和握手之后过程
 */
@ Component
public class ChatHandshakeInterceptor implements HandshakeInterceptor {
     
      /**
     * 握手之前,若返回false,则不建立链接
     */
      @Override
      public boolean beforeHandshake(ServerHttpRequest request , ServerHttpResponse response , WebSocketHandler wsHandler ,
                Map<String, Object> attributes ) throws Exception {
           
           System. out .println( "--------------握手开始..." + wsHandler );
            return true ;
     }
     
      /**
     * 握手之后
     */
      @Override
      public void afterHandshake(ServerHttpRequest request , ServerHttpResponse response , WebSocketHandler wsHandler ,
                Exception exception ) {
           System. out .println( "--------------握手成功啦..." );
     }
}
ChatWebSocketHandler.java(主要操作)
import org.springframework.web.socket.CloseStatus;
import org.springframework.web.socket.TextMessage;
import org.springframework.web.socket.WebSocketHandler;
import org.springframework.web.socket.WebSocketMessage;
import org.springframework.web.socket.WebSocketSession;
@Component
public class ChatWebSocketHandler implements WebSocketHandler {
     
      /**
      * webscoket 建立好链接之后的处理函数 -- 连接建立后的准备工作
      */
      @Override
      public void afterConnectionEstablished(WebSocketSession session ) throws Exception {
            // TODO Auto-generated method stub
           System. out .println( "webscoket建立好链接之后的处理函数--连接建立后的准备工作" );
           
            //向客户端发送消息
           TextMessage message = new TextMessage( "从服务端发送的请求...链接建立成功" );
            session .sendMessage( message );
     }
     
      /**
     * 客户端发送服务器的消息时的处理函数,在这里收到消息之后可以分发消息
     */
      //处理消息:当一个新的WebSocket到达的时候,会被调用(在客户端通过 Websocket API发送的消息会经过这里,然后进行相应的处理)
      @Override
      public void handleMessage(WebSocketSession session , WebSocketMessage<?> message ) throws Exception {
            // TODO Auto-generated method stub
           System. out .println( "客户端发送服务器的消息时的处理函数,在这里收到消息之后可以分发消息" + message + "...." + session );
           
            //向客户端发送消息
            session .sendMessage( new TextMessage( "发送给客户端" ));
     }
     
      /**
     * 消息传输过程中出现的异常处理函数
     * 处理传输错误:处理由底层WebSocket消息传输过程中发生的异常
     */
      @Override
      public void handleTransportError(WebSocketSession session , Throwable exception ) throws Exception {
            // TODO Auto-generated method stub
           System. out .println( "消息传输过程中出现的异常处理函数" );
     }
     
      /**
     * websocket 链接关闭的回调
     * 连接关闭后:一般是回收资源等
     */
      @Override
      public void afterConnectionClosed(WebSocketSession session , CloseStatus closeStatus ) throws Exception {
            // TODO Auto-generated method stub
           System. out .println( "websocket链接关闭的回调" );
     }
     
      /**
     * 是否支持处理拆分消息,返回true返回拆分消息
     */
      //是否支持部分消息:如果设置为true,那么一个大的或未知尺寸的消息将会被分割,并会收到多次消息(会通过多次调用方法handleMessage(WebSocketSession, WebSocketMessage). )
      //如果分为多条消息,那么可以通过一个api:org.springframework.web.socket.WebSocketMessage.isLast() 是否是某条消息的最后一部分。
      //默认一般为false,消息不分割
      @Override
      public boolean supportsPartialMessages() {
            // TODO Auto-generated method stub
            return false ;
     }
     
}

WebSocketConfig.java (配置webscoket)
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.socket.config.annotation.EnableWebSocket;
import org.springframework.web.socket.config.annotation.WebSocketConfigurer;
import org.springframework.web.socket.config.annotation.WebSocketHandlerRegistry;
/**
 *
 * 说明:WebScoket配置处理器
 * 把处理器和拦截器注册到spring websocket
 */
@Component
//配置开启WebSocket服务用来接收 ws 请求
@EnableWebSocket
public class WebSocketConfig implements WebSocketConfigurer {
     
      //注入处理器
      @Autowired
      private ChatWebSocketHandler webSocketHandler ;
      @Autowired
      private ChatHandshakeInterceptor chatHandshakeInterceptor ;
     
      public void registerWebSocketHandlers(WebSocketHandlerRegistry registry ) {
            //添加一个处理器还有定义处理器的处理路径( 注意 报403加.setAllowedOrigins("*")
            registry .addHandler( webSocketHandler , "/ws" ).addInterceptors( chatHandshakeInterceptor ).setAllowedOrigins( "*" );
            /*
            * 在这里我们用到.withSockJS(),SockJS是spring用来处理浏览器对 websocket 的兼容性,
            * 目前浏览器支持 websocket 还不是很好,特别是IE11以下.
            * SockJS能根据浏览器能否支持 websocket 来提供三种方式用于 websocket 请求,
            * 三种方式分别是 WebSocket, HTTP Streaming以及 HTTP Long Polling
            */
            registry .addHandler( webSocketHandler , "/ws/sockjs" ).addInterceptors( chatHandshakeInterceptor ).withSockJS();
     }
     
}
3.前台vue
testwebsocket.vue
< template >
    < Card >
       < div >
           < Button type = "primary" @ click = "threadPoxi()" icon = "plus" > 发送消息 </ Button >
       </ div >
    </ Card >
</ template >
< script >
export default {
     data () {
            return {
                websocket: null
           }
     },
     methods: {
           threadPoxi(){  // 实际调用的方法 如果ws已经连接则直接发送消息;如正在开启状态,则等待300毫秒,再发送消息;若未开启 ,则等待500毫秒,再发送消息。
            //参数
            const agentData = "从前台发出的信息" ;
            //若是ws开启状态
            if ( this .websocket.readyState === this .websocket.OPEN) {
                this .websocketsend(agentData)
            }
            // 若是 正在开启状态,则等待300毫秒
            else if ( this .websocket.readyState === this .websocket.CONNECTING) {
                let that = this ; //保存当前对象this
                setTimeout( function () {
                    that.websocketsend(agentData)
                }, 300);
            }
            // 若未开启 ,则等待500毫秒
            else {
                this .initWs();
                let that = this ; //保存当前对象this
                setTimeout( function () {
                    that.websocketsend(agentData)
                }, 500);
            }
        },
        initWs () {
            if ( 'WebSocket' in window) { 
                this .websocket = new WebSocket( "ws://localhost:8089/项目名/ws" ); 
            } 
            else
                alert( 'Sorry, websocket not supported by your browser.'
            }
            //数据接收
            this .websocket.onmessage = this .websocketonmessage;
            /*
            this.websocket.onclose = this.websocketclose; */
                 //this.websocket.close();
        },
        websocketonmessage(e){ //数据接收
           console.log( 'Client received a message' ,e.data);
        },
        websocketsend(agentData){ //数据发送
            this .websocket.send(agentData);
        },
        websocketclose(e){  //关闭
            this .websocket.close();
            console.log( "connection closed (" + e.code + ")" );
        }
       
     },
     created(){
            this .initWs();
     }
}
</ script >


欢迎指正,转载请说明。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值