Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/gwt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从基本Spring被动Websocket服务器向非被动客户端发送消息_Spring_Spring Boot_Websocket_Spring Webflux_Project Reactor - Fatal编程技术网

从基本Spring被动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,但无法使用它们,因为我无

Q:如何从Spring反应式Websocket(服务器)向JS Websocket(客户端)发送消息?

我正在尝试将消息从标准Spring反应式websocket服务器发送到非反应式JS客户端。建立初始连接并将响应消息从服务器发送回客户端。但当我试图通过REST点调用定制方法来向客户端发送消息时,消息并没有被发送

流程是这样的,首先调用API REST端点来向信号处理程序发送消息给特定的客户机,然后客户机应该用REST API发送回的响应进行响应

查看了rsockets,但无法使用它们,因为我无法更改客户端,并且客户端仅支持标准WebSocket。我还想知道使用反应式服务器和客户端的轮询响应是否会提高性能,因为这看起来像是阻塞操作

套接字处理程序:

@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();
}
}