1

我想将数据从 Boot(服务器)发送到客户端!我正在使用 stomp websocket!

WebSocketClient 无法正常工作,错误是来自服务器 [200] 的 HTTP 响应不允许 HTTP 升级到 WebSocket!

这是我的 Java Stomp WebSocket 客户端代码!在这段代码中,我尝试配置 handShakeHeader .... 但它不起作用!

package refill.station.websocket;

import org.junit.jupiter.api.Test;
import org.springframework.messaging.converter.MappingJackson2MessageConverter;
import org.springframework.messaging.simp.stomp.StompHeaders;
import org.springframework.messaging.simp.stomp.StompSession;
import org.springframework.messaging.simp.stomp.StompSessionHandler;
import org.springframework.messaging.simp.stomp.StompSessionHandlerAdapter;
import org.springframework.scheduling.concurrent.ConcurrentTaskScheduler;
import org.springframework.web.socket.WebSocketHttpHeaders;
import org.springframework.web.socket.client.WebSocketClient;
import org.springframework.web.socket.client.standard.StandardWebSocketClient;
import org.springframework.web.socket.messaging.WebSocketStompClient;

import java.net.URI;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.ExecutionException;

public class WebSocketTest {

    @Test
    public void WebSocketTest() {
        WebSocketClient webSocketClient = new StandardWebSocketClient();
        WebSocketStompClient stompClient = new WebSocketStompClient(webSocketClient);
        stompClient.setMessageConverter(new MappingJackson2MessageConverter());
        stompClient.setTaskScheduler(new ConcurrentTaskScheduler());

        String url = "ws://localhost:8080/ws/websocket";
        StompSessionHandler sessionHandler = new StompSessionHandlerAdapter() {};

        List<String> protocols = new ArrayList<>();
        protocols.add("v10.stomp");
        protocols.add("v11.stomp");

        WebSocketHttpHeaders handSahkeHeaders = new WebSocketHttpHeaders();
        handSahkeHeaders.setUpgrade("websocket");
        handSahkeHeaders.setConnection("Upgrade");
        handSahkeHeaders.setSecWebSocketVersion("13");
        handSahkeHeaders.setSecWebSocketKey("4hb9p5/JjeKLed5aXlBqnw==");
        handSahkeHeaders.setSecWebSocketProtocol(protocols);

        StompHeaders stompHeaders = new StompHeaders();

        StompSession stompSession = null;
        try {
            stompSession = stompClient.connect(URI.create(url), handSahkeHeaders, stompHeaders, sessionHandler).get();
        } catch (InterruptedException e) {
            e.printStackTrace();
        } catch (ExecutionException e) {
            e.printStackTrace();
        }
        stompSession.send("/app/control/complete", "msg");
//                    StompSession stompSession = stompClient.connect(url, sessionHandler).get();


    }
}

我用 javascript 检查了我的 WebSocket 服务器,它工作正常!这是我的 WebSocket 服务器配置!

package refill.station.config.websocket;

import org.springframework.context.annotation.Configuration;
import org.springframework.messaging.simp.config.MessageBrokerRegistry;
import org.springframework.web.socket.config.annotation.EnableWebSocketMessageBroker;
import org.springframework.web.socket.config.annotation.StompEndpointRegistry;
import org.springframework.web.socket.config.annotation.WebSocketMessageBrokerConfigurer;
import org.springframework.web.socket.server.RequestUpgradeStrategy;
import org.springframework.web.socket.server.standard.TomcatRequestUpgradeStrategy;
import org.springframework.web.socket.server.support.DefaultHandshakeHandler;

@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfiguration implements WebSocketMessageBrokerConfigurer {
    @Override
    public void registerStompEndpoints(StompEndpointRegistry registry) { 
        RequestUpgradeStrategy upgradeStrategy = new TomcatRequestUpgradeStrategy();

        registry.addEndpoint("/ws")
                .withSockJS();
        registry.addEndpoint("/ws")
                .setHandshakeHandler(new DefaultHandshakeHandler(upgradeStrategy))
                .setAllowedOrigins("*");
    }

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

最后,它是我的 websocket 控制器!

package refill.station.controller.websocket;

import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.messaging.handler.annotation.MessageMapping;
import org.springframework.messaging.handler.annotation.Payload;
import org.springframework.messaging.handler.annotation.SendTo;
import org.springframework.messaging.simp.SimpMessagingTemplate;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RestController;


@RequiredArgsConstructor
@RestController
@Slf4j
public class RefillerCommunicateController {
    @MessageMapping("/control/complete")
    @SendTo("/control/operate")
    public String test(@Payload String data) {
        log.info("RefillerCommunicateController-test method");
        return "test";
    }
}
4

0 回答 0