STOMP目标网址与端点网址

mzo*_*zoz 6 java stomp websocket

以下代码来自spring mvc文档

@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfig implements WebSocketMessageBrokerConfigurer {

    @Override
    public void registerStompEndpoints(StompEndpointRegistry registry) {
        registry.addEndpoint("/portfolio");
    }

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

@Controller
public class GreetingController {

    @MessageMapping("/greeting") {
    public String handle(String greeting) {
        return "[" + getTimestamp() + ": " + greeting;
    }
}
Run Code Online (Sandbox Code Playgroud)

客户端连接http://localhost:8080/portfolio建立WebSocket连接,我想知道客户端发送请求的确切网址是什么?

http://localhost:8080/portfolio/app

要么

http://localhost:8080/app

在实际的WebSocket框架中,destination标头是否包含相对网址(例如/app/topic或绝对网址?

Kau*_*ule 5

[安卓] https://github.com/NaikSoftware/StompProtocolAndroid

[春季] https://docs.spring.io/spring/docs/5.1.9.RELEASE/spring-framework-reference/web.html#websocket-stomp

只需使用设置终点

addEndpoint("/portfolio");
Run Code Online (Sandbox Code Playgroud)

使用以下 URL 连接到 websocket

ws://localhost:8080/portfolio
Run Code Online (Sandbox Code Playgroud)

但请记住,您只需连接到套接字一次,然后调用没有 URL 的端点。因为socket是流线型连接,你只需要建立一次连接。

setApplicationDestinationPrefixes("/app");
Run Code Online (Sandbox Code Playgroud)

上面的行将使用此设置端点 /app,您只能通过套接字发布。但是,所有订阅此主题的人都会收到通知。

enableSimpleBroker("/topic");
Run Code Online (Sandbox Code Playgroud)

Broker 负责处理两者的订阅和发布,因为它们以双重方式侦听和发送数据,这意味着与 /app 不同的是发布和订阅。

private var mStompClient: StompClient? = null
mStompClient = Stomp.over(Stomp.ConnectionProvider.OKHTTP, "ws://localhost:8080/portfolio")
Run Code Online (Sandbox Code Playgroud)

使用上面的行连接到 websocket。因为我们只需要连接到套接字端点一次,就用单例编写它。

val response = stomp.topic("/topic")
.subscribe { topicMessage -> }

Run Code Online (Sandbox Code Playgroud)

现在上面的行将订阅您的套接字客户端,这意味着无论何时您从 /topic 推送数据,都会通知此响应变量。

stompClient.send(StompMessage(StompCommand.SEND,
    listOf(StompHeader(StompHeader.DESTINATION, "/topic")),
    gson.toJson(myDataModel)))?
.subscribe()
Run Code Online (Sandbox Code Playgroud)

使用上面的行,您将向指定为 /topic 的套接字发送数据。

@MessageMapping("/action")
fun performDeviceAction(@Payload myDataModel: MyDataModel) {}
Run Code Online (Sandbox Code Playgroud)

使用上面的行从套接字 /action 上的客户端接收数据

public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {
        registry.addHandler(new SocketTextHandler(), "/user");
    }
Run Code Online (Sandbox Code Playgroud)

为了告诉 Spring 将客户端请求转发到端点,我们需要注册处理程序。上面的代码片段将注册一个客户端。

使用以下链接并下载源代码以获取更多信息 https://www.javainuse.com/spring/boot-websocket

  • ws://localhost:8080/portfolio 使用此路径只是为了连接到套接字,之后每次通信只需使用 /topic 进行通信。您不必每次都输入完整的 URL。我已经更新了答案,只需结账一次。 (2认同)