从基本Spring被动Websocket服务器向非被动客户端发送消息
Q:如何从Spring反应式Websocket(服务器)向JS Websocket(客户端)发送消息? 我正在尝试将消息从标准Spring反应式websocket服务器发送到非反应式JS客户端。建立初始连接并将响应消息从服务器发送回客户端。但当我试图通过REST点调用定制方法来向客户端发送消息时,消息并没有被发送 流程是这样的,首先调用API REST端点来向信号处理程序发送消息给特定的客户机,然后客户机应该用REST API发送回的响应进行响应 查看了rsockets,但无法使用它们,因为我无法更改客户端,并且客户端仅支持标准WebSocket。我还想知道使用反应式服务器和客户端的轮询响应是否会提高性能,因为这看起来像是阻塞操作 套接字处理程序:从基本Spring被动Websocket服务器向非被动客户端发送消息,spring,spring-boot,websocket,spring-webflux,project-reactor,Spring,Spring Boot,Websocket,Spring Webflux,Project Reactor,Q:如何从Spring反应式Websocket(服务器)向JS Websocket(客户端)发送消息? 我正在尝试将消息从标准Spring反应式websocket服务器发送到非反应式JS客户端。建立初始连接并将响应消息从服务器发送回客户端。但当我试图通过REST点调用定制方法来向客户端发送消息时,消息并没有被发送 流程是这样的,首先调用API REST端点来向信号处理程序发送消息给特定的客户机,然后客户机应该用REST API发送回的响应进行响应 查看了rsockets,但无法使用它们,因为我无
@Component
public class ReactiveWebSocketHandler implements WebSocketHandler {
Map<String, WebSocketSession> socketSessions = new HashMap<>();
@Override
public Mono<Void> handle(WebSocketSession session) {
//Store current session in map.
WebsocketContext.WEB_SOCKET_SESSIONS.put(session.getId(), session);
Flux<WebSocketMessage> output = session.receive()
.map(value -> session.textMessage("Subscription succesful, SessionId: " + session.getId()));
return session.send(output);
}
public boolean sendMessageToClient(String sessionId) {
//Get stored session and send message.
WebSocketSession wss = WebsocketContext.WEB_SOCKET_SESSIONS.get(sessionId);
var message = Mono.just(wss.textMessage("Server message"));
wss.send(message);
//for now true is returned but later this method should wait for answer from client in form of string
return true;
}
}
@组件
公共类ReactiveWebSocketHandler实现WebSocketHandler{
Map socketSessions=new HashMap();
@凌驾
公共单声道句柄(WebSocketSession会话){
//将当前会话存储在映射中。
WebsocketContext.WEB\u SOCKET\u SESSIONS.put(session.getId(),session);
通量输出=会话。接收()
.map(value->session.textMessage(“订阅成功,SessionId:+session.getId()));
返回会话。发送(输出);
}
公共布尔sendMessageToClient(字符串sessionId){
//获取存储的会话并发送消息。
WebSocketSession wss=WebsocketContext.WEB_SOCKET_SESSIONS.get(sessionId);
var message=Mono.just(wss.textMessage(“服务器消息”);
发送(消息);
//现在返回true,但稍后该方法应等待客户机以字符串形式给出的答案
返回true;
}
}
存储套接字会话的上下文
public class WebsocketContext {
public static Map<String, WebSocketSession> WEB_SOCKET_SESSIONS = new HashMap<>();
}
公共类WebsocketContext{
公共静态映射WEB_套接字_会话=新建HashMap();
}
配置:
@Configuration
public class WebConfig {
@Bean
public HandlerMapping webSocketHandlerMapping() {
Map<String, WebSocketHandler> map = new HashMap<>();
map.put("/websocket",new ReactiveWebSocketHandler());
SimpleUrlHandlerMapping handlerMapping = new SimpleUrlHandlerMapping();
handlerMapping.setOrder(1);
handlerMapping.setUrlMap(map);
return handlerMapping;
}
@Bean
public WebSocketHandlerAdapter handlerAdapter() {
return new WebSocketHandlerAdapter();
}
}
@配置
公共类网络配置{
@豆子
公共HandlerMapping webSocketHandlerMapping(){
Map Map=newhashmap();
put(“/websocket”,新的ReactiveWebSocketHandler());
SimpleUrlHandlerMapping handlerMapping=新的SimpleUrlHandlerMapping();
handlerMapping.setOrder(1);
setUrlMap(map);
返回句柄映射;
}
@豆子
公共WebSocketHandlerAdapter handlerAdapter(){
返回新的WebSocketHandlerAdapter();
}
}