es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Conexión al WebSocket

Intento conectar el socket web desde Angular a Spring Boot con SockJS:
Tengo errores después de la conexión a los sockets del servidor:enter image description here

Configuración de Spring Boot:

@Override
    public void configureMessageBroker(MessageBrokerRegistry config) {
        config.enableSimpleBroker("/");
        config.setUserDestinationPrefix("/user");
        // config.setApplicationDestinationPrefixes("/user");
    }

    @Override
    public void registerStompEndpoints(StompEndpointRegistry registry) {
        registry.addEndpoint("/ws")
                .setAllowedOrigins("http://localhost:4200")
                .setHandshakeHandler(new UserHandshakeHandler())
                .withSockJS();
    }

    @Override
    public boolean configureMessageConverters(List<messageconverter> messageConverters) {
        DefaultContentTypeResolver resolver = new DefaultContentTypeResolver();
        resolver.setDefaultMimeType(MimeTypeUtils.APPLICATION_JSON);
        MappingJackson2MessageConverter converter = new MappingJackson2MessageConverter();
        converter.setObjectMapper(new ObjectMapper());
        converter.setContentTypeResolver(resolver);
        messageConverters.add(converter);
        return false;
    }

Conexión en Angular:

this.socket = new SockJS(environment.serverUrl + socketPrefix + '?token=' + this.authService.getAccessToken());
    this.stompClient = Stomp.over(this.socket);
    this.stompClient.connect({}, () => {
      this.stompClient.subscribe(hubMethodSubscription.noteTextUpdate,
        (data: any) => { console.error(data); this.observableUpdateNoteText.next(JSON.parse(data.body)); });
      this.stompClient.subscribe(hubMethodSubscription.deleteNoteFromOwner,
        (data: any) => { console.error(data); this.observableDeleteNoteFromOwner.next(JSON.parse(data.body)); });
      this.stompClient.subscribe(hubMethodSubscription.sendNewNotificationKek,
        (data: any) => { console.error(data); });
    });

Si uso WebSocket en el front, obtengo un funcionamiento incorrecto, donde solo la primera conexión funciona.

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Parece que estás enfrentando errores después de conectarte a los sockets del servidor mientras intentas conectar WebSocket desde Angular a Spring Boot con SockJS. Según la captura de pantalla proporcionada, parece que la conexión se está cerrando debido a un tiempo de espera.

    Para solucionar este problema, puedes intentar aumentar el valor de tiempo de espera en la configuración de SockJS en el lado del cliente. Puedes hacer esto agregando la siguiente opción al constructor SockJS():

    new SockJS(environment.serverUrl + socketPrefix + '?token=' + this.authService.getAccessToken(), null, {heartbeatTimeout: 60000});
    

    Esta configuración establece el tiempo de espera del latido del corazón en 60 segundos, lo cual debería ser suficiente para la mayoría de los casos. Puedes ajustar este valor según tus requisitos específicos.

    Adicionalmente, puedes verificar que la configuración del WebSocket en el lado del servidor sea correcta ejecutando algunas pruebas utilizando una herramienta como wscat. Esto te ayudará a aislar cualquier problema con la configuración del lado del servidor.

    En general, la conexión a WebSocket desde Angular a Spring Boot con SockJS debería funcionar correctamente si la configuración es correcta. Siguiendo los pasos anteriores, deberías poder identificar y solucionar cualquier problema que estés enfrentando.

Comments are closed.