皮宅 2023-06-29 05:28 采纳率: 50%
浏览 201
已结题

在springboot项目中,学习websocket过程中,使用simpMessagingTemplate遇到的问题:

在springboot项目中,学习websocket过程中,使用simpMessagingTemplate遇到的问题:
配置类如下:

@Configuration
@EnableWebSocketMessageBroker
public class WebSocketStompConfig implements WebSocketMessageBrokerConfigurer {
    /**
     * 注册stomp端点
     *
     * @param registry 注册表
     */
    @Override
    public void registerStompEndpoints(StompEndpointRegistry registry) {
        // 配置WebSocket端点
        // 允许使用socketJs方式访问 即可通过http://IP:PORT/ws来和服务端websocket连接
        registry.addEndpoint("/ws")
//                .setAllowedOrigins("*")
                .setAllowedOriginPatterns("*")
                .withSockJS();
    }

    /**
     * 配置消息代理
     *
     * @param registry 注册表
     */
    @Override
    public void configureMessageBroker(MessageBrokerRegistry registry) {
        // 配置消息代理
        // 订阅Broker名称 user点对点 topic广播即群发
        // 表示客户端订阅地址的前缀信息,也就是客户端接收服务端消息的地址的前缀信息
        String[] strings = new String[]{"/user","/topic"};
        registry.enableSimpleBroker(strings);

        // 配置消息目的地前缀
        // 全局(客户端)使用的消息前缀
        // 指服务端接收地址的前缀,意思就是说客户端给服务端发消息的地址的前缀
        registry.setApplicationDestinationPrefixes("/app");

        // 点对点使用的前缀 无需配置 默认/user
        registry.setUserDestinationPrefix("/user");
    }
}

使用的依赖:

        <!--webSocket-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-websocket</artifactId>
        </dependency>

postman中:
ws://localhost:8080/ws/user
ws://localhost:8080/ws/topic
ws://localhost:8080/user
ws://localhost:8080/topic
都无法连接,有时候报错:
Invalid SockJS path '/user' - required to have 3 path segments
请问怎么才能在postman中测试?在postman中实现客户端与服务端通信?或者其他在线测试?不写前端页面

展开全部

  • 写回答

8条回答 默认 最新

  • 竹山全栈 2023-06-29 11:05
    关注

    以我本人多年代码调试经验以及ChatGPT所给的理论支持得出下面论断,请参考
    在你提供的代码中,似乎存在一些问题导致连接无法正常进行。以下是一些可能的修改来解决这个问题:

    1. 修改registerStompEndpoints方法
      • addEndpoint("/ws")修改为addEndpoint("/ws/**"),以允许WebSocket端点的任意路径。
      • 移除.withSockJS(),以避免使用SockJS。

    修改后的代码如下:

    @Override
    public void registerStompEndpoints(StompEndpointRegistry registry) {
        registry.addEndpoint("/ws/**")
                .setAllowedOriginPatterns("*");
    }
    
    1. 修改configureMessageBroker方法
      • 修改registry.enableSimpleBroker(strings)registry.enableSimpleBroker("/topic"),只配置/topic作为消息代理。
      • 移除registry.setUserDestinationPrefix("/user"),因为默认已经配置了该前缀。

    修改后的代码如下:

    @Override
    public void configureMessageBroker(MessageBrokerRegistry registry) {
        registry.enableSimpleBroker("/topic");
        registry.setApplicationDestinationPrefixes("/app");
    }
    

    需要注意的是,以上修改假设你希望使用/ws作为WebSocket连接路径,/topic作为广播消息的目的地前缀。你可以根据你的实际需求进行调整。

    请确保在应用启动时重新编译并部署这些修改,并确保你的WebSocket控制器或服务类能够处理相关的WebSocket请求。然后你可以使用Postman或其他WebSocket客户端来尝试连接。

    如果问题仍然存在,请留言评论。

    评论
  • pzzhao 2023-06-29 15:31
    关注
    评论
  • 自在猫先生 2023-06-30 07:31
    关注

    源于chatGPT仅供参考

    在Postman中进行WebSocket通信测试是有一定限制的,因为Postman主要是用于HTTP请求的测试工具,对于WebSocket的支持相对有限。您可以尝试使用其他专门用于WebSocket测试的工具来进行测试,如Wscat、WebSocketKing等。
    
    以下是使用Wscat进行WebSocket测试的步骤:
    
    1. 安装Node.js:确保您的机器上已安装Node.js运行环境。
    
    2. 安装Wscat:在终端或命令提示符中运行以下命令安装Wscat(Websocket Cat):
    

    npm install -g wscat

    
    3. 启动WebSocket连接:在终端或命令提示符中,使用以下命令连接到WebSocket服务端:
    

    wscat -c ws://localhost:8080/ws

    
    注意将`ws://localhost:8080/ws`替换为您的服务器地址和WebSocket端点路径。
    
    4. 输入命令与服务端进行通信:一旦成功建立WebSocket连接,您可以直接在终端或命令提示符中输入命令来与服务端进行通信。
    
    例如,您可以发送`SUBSCRIBE`命令来订阅某个主题:
    

    SUBSCRIBE /topic/messages

    
    然后,当有新消息发布到`/topic/messages`主题时,您将在终端或命令提示符中看到相关的消息。
    
    请注意,通过这种方式进行WebSocket测试,只能模拟客户端发送消息以及接收服务端响应的功能,无法模拟实时通信场景下的双向通信。如果需要测试更复杂的WebSocket功能,建议编写简单的前端页面来进行测试,以获得更完整和准确的结果。
    
    

    在Postman中进行WebSocket测试可能会有一些限制,因为Postman主要用于HTTP请求的测试。但你可以尝试使用其他工具来模拟WebSocket客户端与服务端的通信,例如使用wscat命令行工具或者使用JavaScript编写一个简单的WebSocket客户端。

    首先,确保WebSocket服务已经启动并监听在/ws路径上。然后,你可以使用以下命令在命令行中使用wscat工具测试WebSocket连接:

    wscat -c ws://localhost:8080/ws
    

    该命令将创建一个WebSocket连接到指定的URL,这样你就可以与服务端进行通信了。

    如果你想在Java代码中编写一个简单的WebSocket客户端,你可以使用java-websocket库。添加以下依赖到你的项目中:

    <dependency>
        <groupId>org.java-websocket</groupId>
        <artifactId>Java-WebSocket</artifactId>
        <version>1.5.2</version>
    </dependency>
    

    然后,可以编写一个简单的WebSocket客户端代码来与服务端通信:

    import org.java_websocket.client.WebSocketClient;
    import org.java_websocket.handshake.ServerHandshake;
    
    import java.net.URI;
    import java.net.URISyntaxException;
    
    public class WebSocketTest {
    
        public static void main(String[] args) {
            try {
                WebSocketClient client = new WebSocketClient(new URI("ws://localhost:8080/ws")) {
                    @Override
                    public void onOpen(ServerHandshake serverHandshake) {
                        System.out.println("Connected to WebSocket server");
                        // 在连接成功后,你可以在这里发送消息给服务端
                        send("Hello from WebSocket client");
                    }
    
                    @Override
                    public void onMessage(String message) {
                        System.out.println("Received message from server: " + message);
                    }
    
                    @Override
                    public void onClose(int code, String reason, boolean remote) {
                        System.out.println("WebSocket connection closed");
                    }
    
                    @Override
                    public void onError(Exception e) {
                        System.err.println("WebSocket error: " + e.getMessage());
                    }
                };
    
                client.connect();
            } catch (URISyntaxException e) {
                System.err.println("Invalid WebSocket URI: " + e.getMessage());
            }
        }
    }
    

    该代码将创建一个WebSocket客户端并连接到指定的URL。在连接成功后,你可以在onOpen方法中发送消息到服务端,在onMessage方法中接收从服务端发来的消息。

    希望以上内容能够帮助你进行WebSocket的测试!

    展开全部

    评论 编辑记录
  • PhoenixRiser 2023-06-29 05:52
    关注

    TechWhizKid参考GPT回答:

    • 你用Postman直接连接WebSocket的方式可能不对。
    • 在WebSocket中,不是通过HTTP请求(如GET或POST)来发送和接收消息的,而是通过WebSocket协议来进行。而Postman主要用于模拟HTTP请求,而不是WebSocket请求。WebSocket请求要用专门的客户端,比如HTML中的JavaScript客户端或者其他支持WebSocket的客户端。
    • 遇到的 Invalid SockJS path '/user' - required to have 3 path segments错误,SockJS期待的路径格式应该如下:/serverId/sessionId/transport, 在你的请求中这个格式并没有满足。
    • 一个简单的用JavaScript进行WebSocket通信的示例代码:
    // 连接到WebSocket服务器
    var socket = new SockJS('http://localhost:8080/ws');
    var stompClient = Stomp.over(socket);
    
    // 连接到服务器
    stompClient.connect({}, function(frame) {
        console.log('Connected: ' + frame);
    
        // 订阅某个主题,当有新消息时,服务器会主动推送过来
        stompClient.subscribe('/topic/greetings', function(greeting){
            console.log(JSON.parse(greeting.body).content);
        });
    });
    
    // 向服务器发送消息
    stompClient.send("/app/hello", {}, JSON.stringify({'name': "your_name"}));
    
    • 这段代码先创建一个SockJS客户端,用Stomp协议进行连接。一旦连接成功,将订阅/topic/greetings主题,并打印所有收到的消息。同时,也可以用stompClient.send方法向服务器发送消息。
    • 此处的'/app/hello'对应的就是你在后端Spring Boot应用中定义的处理消息的方法的映射地址。
    • 如果你用的是前端框架(例如React或Angular),可能要安装stompjs和sockjs-client这两个npm包来用上述的JavaScript代码。
    • 同时,你要保证你的后端Spring Boot应用的WebSocket端点已经正确配置并运行在了8080端口。
    评论
  • CF2301_77400554X 2023-06-29 06:28
    关注

    引用chatgpt内容作答:
    根据你提供的配置和错误信息,看起来出现了SockJS路径无效的问题。错误消息"Invalid SockJS path '/user' - required to have 3 path segments"表示SockJS路径'/user'需要包含3个路径段。

    在你的代码中,你将SockJS路径设置为"/ws",这意味着你的WebSocket连接应该使用以下URL格式进行访问:

    ws://localhost:8080/ws
    

    关于使用WebSocket与服务端进行通信,你可以尝试以下步骤:

    1、确保WebSocket服务已正确启动并监听8080端口。
    2、使用postman或任何WebSocket客户端工具,在URL中使用正确的WebSocket连接地址,例如:ws://localhost:8080/ws。
    3、通过WebSocket连接发送和接收消息。
    需要注意的是,WebSocket是一种基于长连接的协议,通信需要使用WebSocket客户端而不是普通的HTTP客户端,如postman。你可以使用支持WebSocket的客户端库(如JavaScript中的WebSocket API)或编写WebSocket客户端代码来进行测试和交互。

    另外,如果你想在应用中使用STOMP协议进行更高级的消息传递,你还需要编写相应的STOMP消息处理器和控制器。simpMessagingTemplate通常用于在应用内部发送STOMP消息,而不是用于与客户端进行WebSocket通信。

    希望这些信息对你有所帮助!

    评论
  • CSDN-Ada助手 CSDN-AI 官方账号 2023-06-29 09:34
    关注
    • 这篇博客: SpringBoot-WebSocket 使用SimpMessagingTemplate发送后前端无法监听到消息中的 修改后 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
    •     @Override
          public void configureMessageBroker(MessageBrokerRegistry registry) {
              //表示客户端订阅地址的前缀信息,也就是客户端接收服务端消息的地址的前缀信息
              registry.enableSimpleBroker("/topicHome","/topicChat");
              //指服务端接收地址的前缀,意思就是说客户端给服务端发消息的地址的前缀
              registry.setApplicationDestinationPrefixes("/app");
          }
      
    评论
  • 技术宅program 2023-06-29 15:35
    关注
    评论
编辑
预览

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 7月3日
  • 修改了问题 6月29日
  • 赞助了问题酬金15元 6月29日
  • 创建了问题 6月29日
手机看
程序员都在用的中文IT技术交流社区

程序员都在用的中文IT技术交流社区

专业的中文 IT 技术社区,与千万技术人共成长

专业的中文 IT 技术社区,与千万技术人共成长

关注【CSDN】视频号,行业资讯、技术分享精彩不断,直播好礼送不停!

关注【CSDN】视频号,行业资讯、技术分享精彩不断,直播好礼送不停!

客服 返回
顶部