我设法使用Spring 5 Reactive WebSocket支持(Chapter 23.2.4)创建WebSocketHandler
。接收和发送所有工作正常。但是,我无法弄清楚如何检测客户端断开连接。在调试客户端时,将其断开连接,在HttpServerWSOperations
类(netty.http.server
包)中停在服务器端的某处,它会检测到CloseWebSocketFrame
。
有关如何处理客户端断开连接的任何建议吗?
答案 0 :(得分:3)
我在被动 org.springframework.web.reactive.socket.WebSocketHandler 中实现了一个关闭事件处理程序,如下所示:
public Mono<Void> handle(final WebSocketSession session) {
final String sessionId = session.getId();
if(sessions.add(sessionId)) { // add session id to set to keep a count of active sessions
LOG.info("Starting WebSocket Session [{}]", sessionId);
// Send the session id back to the client
WebSocketMessage msg = session.textMessage(String.format("{\"session\":\"%s\"}", sessionId));
// Register the outbound flux as the source of outbound messages
final Flux<WebSocketMessage> outFlux = Flux.concat(Flux.just(msg), newMetricFlux.map(metric -> {
LOG.info("Sending message to client [{}]: {}", sessionId, metric);
return session.textMessage(metric);
}));
// Subscribe to the inbound message flux
session.receive().doFinally(sig -> {
LOG.info("Terminating WebSocket Session (client side) sig: [{}], [{}]", sig.name(), sessionId);
session.close();
sessions.remove(sessionId); // remove the stored session id
}).subscribe(inMsg -> {
LOG.info("Received inbound message from client [{}]: {}", sessionId, inMsg.getPayloadAsText());
});
return session.send(outFlux);
}
return Mono.empty();
}
newMetricFlux
字段是出站websocket消息的来源。挂钩事件的技巧是入站消息流量的doFinally。当websocket客户端关闭时,入站通量终止。
出于某种原因,在netty频道关闭和执行doFinally
回调之间有1分钟的延迟。不知道为什么。
这是连接并立即关闭的浏览器客户端的日志输出。注意第3行和第4行之间的60秒延迟。
2017-08-03 11:15:41.177 DEBUG 28505 --- [ctor-http-nio-2] r.i.n.http.server.HttpServerOperations : New http connection, requesting read
2017-08-03 11:15:41.294 INFO 28505 --- [ctor-http-nio-2] c.h.w.ws.NewMetricsWebSocketHandler : Starting WebSocket Session [87fbe66]
2017-08-03 11:15:48.294 DEBUG 28505 --- [ctor-http-nio-2] r.i.n.http.server.HttpServerOperations : CloseWebSocketFrame detected. Closing Websocket
2017-08-03 11:16:48.293 INFO 28505 --- [ctor-http-nio-2] c.h.w.ws.NewMetricsWebSocketHandler : Terminating WebSocket Session (client side) sig: [ON_COMPLETE], [87fbe66]
更新:2017年10月13日:
从Spring 5 GA开始,上面提到的延迟不存在,我观察到在客户端关闭后立即调用我的回调。不确定修复了哪个版本,但正如我所说,它已在5.0 GA中修复。
答案 1 :(得分:0)
您可以通过[[fallthrough]]
方法检测到这一点。由于方法afterConnectionClosed
,您甚至可以处理传输错误。这是一段代码:
handleTransportError