Spring Boot WebSocket не работает в дуплексном режиме - PullRequest
0 голосов
/ 23 сентября 2019

Я разрабатываю связь через веб-сокет между Spring-boot и React.Я создаю простое серверное приложение и простую веб-страницу, веб-страница устанавливает соединение с помощью webSocket.На стороне сервера используется Java с пружинной загрузкой, и веб-страница создается с помощью React.

Сторона с загрузочной пружиной отправляет и получает данные, но может использовать полученные данные только после закрытия соединения!Я хочу одновременный обмен данными

WebSocketConfiguration.java

@Configuration
@EnableWebSocket
public class WebSocketConfiguration implements WebSocketConfigurer {
    @Autowired
    protected MyWebSocketHandler webSocketHandler;

    @Override
    public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {
        registry.addHandler(webSocketHandler, "/test/websocket/channelAlpha");
    }
}

MyWebSocketHandler.java

@Component
public class MyWebSocketHandler implements WebSocketHandler {

    @Override
    public void afterConnectionClosed(WebSocketSession session, CloseStatus status) throws Exception {
        System.out.println("afterConnectionClosed");
    }

    @Override
    public void afterConnectionEstablished(WebSocketSession session) throws Exception {
        System.out.println("afterConnectionEstablished");

        int max = 0;
        while ( true && max < 10  ) {
            Thread.sleep( 3000 );
            System.out.println("pulsing...");
            session.sendMessage( new TextMessage("{\"pulse\": \"ciao\"}") );
            max++;
        }
        session.close( CloseStatus.GOING_AWAY );
}

    @Override
    public void handleMessage(WebSocketSession webSocketSession, WebSocketMessage<?> webSocketMessage) throws Exception {
        System.out.println( webSocketMessage );
    }
}

home.jsx

    connect() {     
        let ref = this;
        this.stream = new RealTime(
            received => {
                console.log( received.data );
            },
            error => {
                console.error("error");
                console.error(error);
            },
            () => {
                console.log("connection open");
                ref.stream.send( "Message from client" );
                ref.pulse();
            },
            closeStatus => {
                console.log("main - stream closed ["+ JSON.stringify(closeStatus) +"]");
            }
        );
    }

    // this method is called on start app
    pulse() {
        this.pulseOn++;
        let ref = this;
        setTimeout(function(){
            ref.stream.send("xxx");
            if( ref.pulseOn < 10 ) ref.pulse();
        }, 1000);
    }
}

realTime.js

export default class RealTime {

    stream = null;
    constructor( listener, onError, openListener, closeListener ) {     
        this.send       = this.send.bind( this );       
        this.stream = new WebSocket("ws://localhost:5050/test/websocket/channelAlpha");
        this.stream.onopen = openListener;
        this.stream.onclose = closeListener;
        this.stream.onerror = onError;
        this.stream.onmessage = listener;
}

send( msg ) {
    this.stream.send( msg );
}   

};

...