Sping Boot + Sockjs客户端脱机连接问题

时间:2019-02-12 11:22:21

标签: spring-boot spring-websocket stomp sockjs

我正在尝试将Spring Boot Stomp Server与多个sock.js客户端脱机连接,但收到警告

  

在建立连接之前关闭Websocket

跟着

  

获取http://192.168.1.45:8080/socket/327/si5osugt/jsonp?c=jp.a3xdefl净值:: ERR_ABORTED 404(未找到)

我在后端使用spring-boot-starter-websocket软件包的Spring Boot版本2.1.2,在前端sockjs-client使用1.3.0版本的Angular 6。前端和后端都在端口8080上运行

我在关闭互联网时遇到一些错误。如果互联网已关闭,则iframe会尝试访问https://cdn.jsdelivr.net/npm/sockjs-client@1/dist/sockjs.js

我通过在后端配置stomp服务器来管理,方法是通过将.setClientLibraryUrl添加到可以脱机访问的绝对路径来设置客户端库。

registry.addEndpoint("/socket").setAllowedOrigins("*").withSockJS).setClientLibraryUrl("http://192.168.1.45/dist/sockjs.min.js");

并在http://192.168.1.45/dist/sockjs.min.js上获得200 OK

Spring Boot:

WebSocketConfiguration(扩展AbstractWebSocketMessageBrokerConfigurer)

@Override
public void registerStompEndpoints(StompEndpointRegistry registry) {
    registry.addEndpoint("/socket")
            .setAllowedOrigins("*")
            .withSockJS().setClientLibraryUrl("http://192.168.1.45/dist/sockjs.min.js");
}

@Override
public void configureMessageBroker(MessageBrokerRegistry registry) {
    MessageBrokerRegistry messageBrokerRegistry = registry.setApplicationDestinationPrefixes("/app");
    messageBrokerRegistry.enableSimpleBroker( "/test", "/test2"
    );
}

WebSocketController

private final SimpMessagingTemplate template;

@Autowired
WebSocketController(SimpMessagingTemplate template){
    this.template=template;
}

@MessageMapping("/send/message")
public void onReceivedMessage( String destination , String message){
    this.template.convertAndSend(destination , message);
}

public void convertAndSend(String url, Object o){
    this.template.convertAndSend(url, o);
}

角度6:

TestComponet

ngAfterViewInit() {
  let ws = new SockJS('http://192.168.1.45:8080/socket');
  this.stompClient = Stomp.over(ws);
  let that = this;
  that.stompClient.subscribe("/test", (message) => {
    if (message.body) {
     console.log(message.body);
    }
  });
  that.stompClient.subscribe("/test2", (message) => {
    if (message.body) {
     console.log(message.body);
    }
  });
}

我认为只需将sockjs客户端库添加到脱机可访问路径即可,但我得到警告

  

在建立连接之前关闭Websocket

跟着

  

“获取http://192.168.1.45:8080/socket/327/si5osugt/jsonp?c=jp.a3xdefl net :: ERR_ABORTED 404(未找到)”

该图书馆可以很好地与Internet连接工作,但是我需要它可以同时处理在线和离线情况。

1 个答案:

答案 0 :(得分:1)

我遇到了同样的问题,并通过删除SockJs修复了它。 所以现在我目前仅使用Stomp-Websockets。

SpringBoot-Service(WebsocketConfiguration)中的更改:

registry.addEndpoint("/justStomp").setAllowedOrigins("*");

我删除了.withSockJS()和.setClientLibraryUrl(../ sockjs.min.js)

更改我的Javascript代码以连接到网络套接字:

  const stompClient = Stomp.client(`ws://localhost:8080/justStomp`);
  stompClient.heartbeat.outgoing = 0;
  stompClient.heartbeat.incoming = 0;
  stompClient.connect({ name: 'test' }, frame => this.stompSuccessCallBack(frame, stompClient), err => this.stompFailureCallBack(err));

我不是使用Stomp.over(sockjs),而是使用Stomp.client方法直接连接到websocket-url。 我在后台使用stomp-plugin启用了RabbitMQ,它仅在2个心跳设置下正常运行。参见此处this example code on Coliru