java Spring Web络流量和WebSocket

bttbmeg0  于 2022-12-25  发布在  Java
关注(0)|答案(2)|浏览(131)

我正在尝试将WebSocket功能添加到使用Spring WebFlux的现有应用程序中。它使用:

  • Spring Boot2.2.1.释放
  • Tomcat容器
  • 配置为提供jsp页面

当我尝试通过JavaScript(从jsp页面内部)连接到它时,收到错误"* failed:WebSocket握手期间出错:意外响应代码:小行星404 *
我注意到,如果我创建一个控制器类Mapurl '/ws/event-emitter '(在我的websocket配置中Map的那个)来接受GET请求,当它试图打开websocket连接时,它会收到来自Javascript调用的请求,这让我更加困惑。
我错过了什么?
在阅读了一些教程在互联网上我设置我的配置如下:

<?xml version="1.0" encoding="UTF-8"?>

4.0.0 org.springframework.boot spring-boot-starter-parent 2.2.1.RELEASE br.com.samsung monitor 0.0.1-SNAPSHOT monitor Health Check Monitor
x一个一个一个一个x一个一个二个x
和Web套接字处理程序类

@Component
public class ReactiveWebSocketHandler implements WebSocketHandler {

    private static final ObjectMapper json = new ObjectMapper();

    private Flux<String> eventFlux = Flux.generate(sink -> {
        Event event = new Event(randomUUID().toString(), now().toString());
        try {
            sink.next(json.writeValueAsString(event));
        } catch (JsonProcessingException e) {
            sink.error(e);
        }
    });

    private Flux<String> intervalFlux = Flux.interval(Duration.ofMillis(1000L))
      .zipWith(eventFlux, (time, event) -> event);

    @Override
    public Mono<Void> handle(WebSocketSession webSocketSession) {
        return webSocketSession.send(intervalFlux
          .map(webSocketSession::textMessage))
          .and(webSocketSession.receive()
            .map(WebSocketMessage::getPayloadAsText).log());
    }

}
var clientWebSocket = new WebSocket("ws://localhost:6600/ws/event-emitter");
clientWebSocket.onopen = function() {
  console.log("clientWebSocket.onopen", clientWebSocket);
  console.log("clientWebSocket.readyState", "websocketstatus");
  clientWebSocket.send("event-me-from-browser");
}
clientWebSocket.onclose = function(error) {
  console.log("clientWebSocket.onclose", clientWebSocket, error);
  events("Closing connection");
}
clientWebSocket.onerror = function(error) {
  console.log("clientWebSocket.onerror", clientWebSocket, error);
  events("An error occured");
}
clientWebSocket.onmessage = function(error) {
  console.log("clientWebSocket.onmessage", clientWebSocket, error);
  events(error.data);
}

function events(responseEvent) {
  document.querySelector(".events").innerHTML += responseEvent + "<br>";
}
mefy6pfw

mefy6pfw1#

我可以通过移除 spring-boot-starter-web 和 *tomcat-embed-碧玉 * 的依赖项来使它工作,我想 spring-boot-starter-web 可能会与 spring-boot-starter-webflux 冲突。
此外,我还更改了我的 ReactiveWebSocketConfiguration 类,以使用 ReactorNettyRequestUpgradeStrategy(而不是 TomcatRequestUpgradeStrategy)设置 WebSocketService bean:

@Bean
public WebSocketService webSocketService() {
    return new HandshakeWebSocketService(new ReactorNettyRequestUpgradeStrategy());
}

在这些更改之后,我的jsp页面停止工作,因为我的Web容器从Tomcat更改为Netty Web Server。我不得不使用Thymeleaf(添加了 spring-boot-starter-thymeleaf 依赖项,配置了它的基本结构并将我的页面转换为.html文件)而不是传统的jsp。
由于时间的限制,我选择从传统的jsp改为Thymeleaf,因为我的应用程序页面很少,而且很简单。
我已经创建了一个非常简单的项目与所有这些配置包括一个虚拟页面连接到WebSocket通过javascript。
https://github.com/atilio-araujo/spring-webflux-websocket

xj3cbfub

xj3cbfub2#

Spring Web络流量WebSocket:

只是为那些试图用webflux实现websocket的人添加这个答案。
1.由于某种原因,OP同时具有webwebflux依赖项。然而,您只需要WebFlux依赖项即可。
1.实现Web套接字处理程序

@Service
    public class WebFluxWebSocketHandler implements WebSocketHandler {
    
        @Override
        public Mono<Void> handle(WebSocketSession webSocketSession) {
            Flux<WebSocketMessage> stringFlux = webSocketSession.receive()
                    .map(WebSocketMessage::getPayloadAsText)
                    .map(String::toUpperCase)
                    .map(webSocketSession::textMessage);
            return webSocketSession.send(stringFlux);
        }
    
    }

1.添加路径-处理程序Map。这里的处理程序是websockethandler的示例。

@Bean
       public HandlerMapping handlerMapping(){
           Map<String, WebFluxWebSocketHandler> handlerMap = Map.of(
                   "/test", handler
           );
           return new SimpleUrlHandlerMapping(handlerMap, 1);
       }

就是这样!现在客户端应该能够连接到ws://localhost:8080/test
查看此处了解更多信息-https://www.vinsguru.com/spring-webflux-websocket/

相关问题