我正在尝试将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>";
}
2条答案
按热度按时间mefy6pfw1#
我可以通过移除 spring-boot-starter-web 和 *tomcat-embed-碧玉 * 的依赖项来使它工作,我想 spring-boot-starter-web 可能会与 spring-boot-starter-webflux 冲突。
此外,我还更改了我的 ReactiveWebSocketConfiguration 类,以使用 ReactorNettyRequestUpgradeStrategy(而不是 TomcatRequestUpgradeStrategy)设置 WebSocketService bean:
在这些更改之后,我的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
xj3cbfub2#
Spring Web络流量WebSocket:
只是为那些试图用
webflux
实现websocket
的人添加这个答案。1.由于某种原因,OP同时具有
web
和webflux
依赖项。然而,您只需要WebFlux
依赖项即可。1.实现Web套接字处理程序
1.添加路径-处理程序Map。这里的处理程序是websockethandler的示例。
就是这样!现在客户端应该能够连接到
ws://localhost:8080/test
查看此处了解更多信息-https://www.vinsguru.com/spring-webflux-websocket/