• 使用vue3 和Springboot 通过 websocket实现前后端通信


    关注 码龄 粉丝数 原力等级 -- 被采纳 被点赞 采纳率 染指余忆 2024-04-14 16:17 采纳率: 42.3% 浏览 6 首页/ 网络 / 使用vue3 和Springboot 通过 websocket实现前后端通信 websocketspring bootvue.js 以下代码是使用vue3 和Springboot 通过 websocket实现前后端通信,但是失败,请指出错误原因并且更正代码 devServer:{ allowedHosts: "all", proxy: { '/spring': { target: 'http://localhost:8081', changeOrigin: true, pathRewrite: { // pathRewrite 的作用是把实际Request Url中的'/api'用""代替 '^/spring': "" } }, '/ws': { target: 'ws://http://localhost:8081', ws: true, changeOrigin: true, // logLevel: 'debug' // 可选,用于调试代理连接 pathRewrite: { // pathRewrite 的作用是把实际Request Url中的'/api'用""代替 '^/ws': "" } }, }, }, package org.example.halospring.HaloSpring.Service.WebsocketService; import jakarta.servlet.http.HttpSession; import jakarta.websocket.*; import jakarta.websocket.server.ServerEndpoint; import org.springframework.web.bind.annotation.RestController; import java.io.IOException; @ServerEndpoint("/webSocket") public class WebsocketImple { public static int number=0; @OnOpen public void onOpen(Session session, HttpSession httpSession) throws IOException { number++; System.out.println("第"+number+"个用户登录"); session.getAsyncRemote().sendText("第"+number+"个用户登录"); } @OnMessage public void onMessage(String message, Session session) throws IOException { System.out.println(message); } @OnClose public void onClose(Session session) { session.getAsyncRemote().sendText("关闭"); number--; System.out.println("用户关闭"); } @OnError public void onError(Throwable error) { System.err.println("WebSocket Error: " + error); } } 展开全部 收起 写回答 好问题 0 提建议 追加酬金 关注问题 微信扫一扫 点击复制链接 分享 邀请回答 编辑 收藏 删除 结题 收藏 举报 追加酬金 (90%的用户在追加酬金后获得了解决方案) 当前问题酬金 ¥ 0 (可追加 ¥500) ¥ 15¥ 20¥ 50¥ 100¥ 200 支付方式 扫码支付 二维码出错 点击刷新 支付金额 15 元 提供问题酬金的用户不参与问题酬金结算和分配 支付即为同意 《付费问题酬金结算规则》 结题 再想想 删除 再等等

    3条回答 默认 最新

    • 专家-赤兔[在线] 全栈领域优质创作者 2024-04-14 16:17
      关注

      引自免费微信小程序:皆我百晓生

      首先,让我们逐个分析您的代码并找出可能的问题。

      1. Vue3 部分:

        • onopen事件处理函数中,您尝试打印event.data,但在WebSocket连接打开时,通常不会发送数据。您可以将这段代码移除,或者更改为您期望在连接成功后发送的消息。
      2. Vue3 部分(修复后的代码):

      
      
      
      
      
      
      1. Spring Boot 部分:

        • 您的WebSocket服务器配置看起来没有问题,但为了确保与Vue3应用正确连接,确认一下端口和URL是否匹配。同时,建议使用Spring Boot的WebSocket支持来创建WebSocket服务,而不是手动实现WebSocket接口。这将使代码更加简洁且易于维护。
      2. Spring Boot 部分(修复后的代码):

      import org.springframework.messaging.handler.annotation.MessageMapping;
      import org.springframework.messaging.handler.annotation.SendTo;
      import org.springframework.stereotype.Component;
      
      @Component
      public class WebSocketController {
      
          private static AtomicInteger counter = new AtomicInteger();
      
          @MessageMapping("/ws/webSocket") // 对应前端的URL
          @SendTo("/topic/messages") // 前端会订阅这个主题
          public String handleMessage(String message) {
              int count = counter.incrementAndGet();
              return "第" + count + "个用户发送: " + message;
          }
      }
      
      1. 配置Spring Boot应用以启用WebSocket支持: 在您的主配置类上添加@EnableWebSocketMessageBroker注解,并定义一个简单的消息代理。
      import org.springframework.context.annotation.Configuration;
      import org.springframework.messaging.simp.config.MessageBrokerRegistry;
      import org.springframework.web.socket.config.annotation.EnableWebSocketMessageBroker;
      import org.springframework.web.socket.config.annotation.StompEndpointRegistry;
      
      @Configuration
      @EnableWebSocketMessageBroker
      public class WebSocketConfig implements WebSocketMessageBrokerConfigurer {
      
          @Override
          public void configureMessageBroker(MessageBrokerRegistry config) {
              config.enableSimpleBroker("/topic");
              config.setApplicationDestinationPrefixes("/app");
          }
      
          @Override
          public void registerStompEndpoints(StompEndpointRegistry registry) {
              registry.addEndpoint("/ws/webSocket").withSockJS();
          }
      }
      
      1. 最后,在前端的Vue3项目中,您应该使用sockjs-client库来连接到WebSocket服务器。这是对main.js进行修改的示例:
      import { createApp } from 'vue'
      import App from './App.vue'
      
      // 引入sockjs-client库
      import SockJS from 'sockjs-client';
      import Stomp from 'stompjs';
      
      createApp(App).mount('#app')
      
      const socket = new SockJS('/spring/ws/webSocket');
      const stompClient = Stomp.over(socket);
      
      stompClient.connect({}, function(frame) {
        console.log('Connected: ' + frame);
        stompClient.subscribe('/topic/messages', function(message) {
          console.log(JSON.parse(message.body));
        });
      });
      

      这样,当您在前端输入文本并点击发送按钮时,消息应该能通过WebSocket传递到Spring Boot服务器,然后广播给所有客户端。同样,当其他客户端发送消息时,前端也会接收到这些消息。注意,上述代码仅作为示例,可能需要根据您的具体需求进行调整。

      展开全部

      评论 编辑记录
    • Kwan的解忧杂货铺 Java领域优质创作者 2024-04-14 16:17
      关注

      下午好🌅🌅🌅
      本答案参考ChatGPT-3.5

      问题:使用vue3和Springboot通过websocket实现前后端通信,但是失败,请指出错误原因并且更正代码。

      解决方案如下:

      1. WebSocket目标地址错误。

      修改前端代码中WebSocket的目标地址,由ws/webSocket改为ws://localhost:8081/webSocket,即:

      let socket = new WebSocket("ws://localhost:8081/webSocket");
      
      1. 前端发送的消息无法传递到后端WebSocket。

      修改前端代码中发送消息函数senMessage,应该使用message.value获取消息内容,同时修改send方法中的参数,即:

      function senMessage() {
        if (socket.readyState === 1) {
          socket.send(message.value);
        }
      }
      
      1. 后端代码中引入了无关的@RestController注解。

      在后端代码中,应该去掉WebsocketImple类上的@RestController注解。

      修改后的前端代码:

      
      
      
      
      
      

      修改后的后端代码:

      package org.example.halospring.HaloSpring.Service.WebsocketService;
      
      import jakarta.servlet.http.HttpSession;
      import jakarta.websocket.*;
      import jakarta.websocket.server.ServerEndpoint;
      
      import java.io.IOException;
      
      @ServerEndpoint("/webSocket")
      public class WebsocketImple {
        public static int number = 0;
      
        @OnOpen
        public void onOpen(Session session, HttpSession httpSession) throws IOException {
          number++;
          System.out.println("第" + number + "个用户登录");
          session.getAsyncRemote().sendText("第" + number + "个用户登录");
        }
      
        @OnMessage
        public void onMessage(String message, Session session) throws IOException {
          System.out.println(message);
        }
      
        @OnClose
        public void onClose(Session session) {
          session.getAsyncRemote().sendText("关闭");
          number--;
          System.out.println("用户关闭");
        }
      
        @OnError
        public void onError(Throwable error) {
          System.err.println("WebSocket Error: " + error);
        }
      }
      

      以上是修改后的代码,建议你将修改后的代码贴到你的项目中进行测试。

      展开全部

      评论 编辑记录
    • CSDN-Ada助手 CSDN-AI 官方账号 2024-04-14 18:20
      关注

      【相关推荐】




      如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^
      评论
    编辑
    预览

    报告相同问题?

  • 相关阅读:
    【Java基础】23.接口
    MySQL中count(*)和information_schema.tables中的table_rows值不相同
    Linux下的的GDB调试技巧一 —— 基础知识和介绍
    Java反射机制
    从github上下载下来的代码下载依赖提示: An unknown git error occurred
    [HDLBits] Fsm hdlc
    实验笔记之——DPVO(Deep Patch Visual Odometry)
    【Linux】进程概念 —— 进程状态
    【DTEmpower案例操作教程】智能模型预警
    如何使用插件扩展Vue的功能
  • 原文地址:https://ask.csdn.net/questions/8088349