在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中实现客户端与服务端通信?或者其他在线测试?不写前端页面

参考这个例子吧


源码
https://github.com/eugenp/tutorials/tree/master/spring-websockets

以我本人多年代码调试经验以及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客户端来尝试连接。

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

postman 8.5以上版本才支持websocket,你可以参考这个博客试试

源于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的测试!

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端口。

引用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通信。

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

  • 这篇博客: SpringBoot-WebSocket 使用SimpMessagingTemplate发送后前端无法监听到消息中的 修改后 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  •     @Override
        public void configureMessageBroker(MessageBrokerRegistry registry) {
            //表示客户端订阅地址的前缀信息,也就是客户端接收服务端消息的地址的前缀信息
            registry.enableSimpleBroker("/topicHome","/topicChat");
            //指服务端接收地址的前缀,意思就是说客户端给服务端发消息的地址的前缀
            registry.setApplicationDestinationPrefixes("/app");
        }
    

参考 https://blog.csdn.net/qq_34330916/article/details/122339251