当前位置: 首页 > 知识库问答 >
问题:

任何人都可以解释这段代码是如何发送消息给指定的用户的

顾亦
2023-03-14
@Bean
public WebSocketHandler webSocketHandler() {
    TopicProcessor<String> messageProcessor = this.messageProcessor();
    Flux<String> messages = messageProcessor.replay(0).autoConnect();
    Flux<String> outputMessages = Flux.from(messages);

    return (session) -> {
        System.out.println(session);

        session.receive().map(WebSocketMessage::getPayloadAsText).subscribe(messageProcessor::onNext, (e) -> {
            e.printStackTrace();
        });

        return session.getHandshakeInfo().getPrincipal().flatMap((p) -> {
            session.getAttributes().put("username", p.getName());
            return session.send(outputMessages.filter((payload) -> this.filterUser(session, payload))
                    .map((payload) -> this.generateMessage(session, payload)));
        }).switchIfEmpty(Mono.defer(() -> {
            return Mono.error(new BadCredentialsException("Bad Credentials."));
        })).then();
    };
}

私有静态映射客户端=new ConcurrentHashMap();public void sendMessageTo(String message,String ToUserName)抛出IOException{

    for (WebSocket item : clients.values()) {
        if (item.username.equals(ToUserName) ) {
            item.session.sendText(message);
            break;
        }
    }
}

我知道所有的消息都存储在outputMessages中并进行子标注。当发出新消息时,它如何找到正确的会话?

共有1个答案

籍靖
2023-03-14

我的猜测是WebSocketHandler是一个只包含一个方法handleWebSocketHandler的接口

我相信这又使它成为一个functionalinterface,可以用作lambda。

(session) -> { ... }

因此,当与客户端建立会话时,客户端发送websocket事件。服务器将查找WebSocketHandler并使用来自发送事件的客户端的会话填充它。

class ExampleHandler implements WebSocketHandler {

    @Override
    public Mono<Void> handle(WebSocketSession session) {

            Mono<Void> input = session.receive()
                    .doOnNext(message -> {
                            // ...
                    })
                    .concatMap(message -> {
                            // ...
                    })
                    .then();

            Flux<String> source = ... ;
            Mono<Void> output = session.send(source.map(session::textMessage));

            return Mono.zip(input, output).then();
    }
}

@Bean
public WebSocketHandler webSocketHandler() {
    return new ExampleHandler();
}
 类似资料:
  • 从Web API 2的模板中,post方法总是这样的: 我不理解这个< code>CreatedAtRoute()方法。有人能给我解释一下吗?

  • 我需要一个推送消息服务器的方案。 现在我选择AutobahnJs+AutobahnPython方案。 AutobahnJs库使用html5的websocket连接AutobahnPython使用的服务器 在javascript中,使用订阅通道,每个客户端使用相同的订阅通道。clientD将消息发布到通道(与订阅通道相同),服务器将消息传递给订阅该通道的所有客户端。 这里有一个问题,我需要应用程序(

  • 问题内容: 我只是在android上开始,而我的java很生锈。我不记得曾经见过像这样嵌套在另一个函数中的函数。有人可以向我确切解释final的作用,并解释为什么您要在另一个函数中嵌套这样的功能吗? 问题答案: 这是一个匿名类。实际发生的情况是正在使用重写的函数创建 的子类。 关于匿名类的最优雅的事情之一是,它们使您可以在需要的地方准确定义单发类。此外,匿名类具有简洁的语法,可减少代码中的混乱情况

  • 我已经阅读了文档,但我发现它很难理解,我将感谢任何帮助!

  • 在过去,你可以使用Google Now发送短信、社交网站和电子邮件。不过,最近的一个更新将允许你使用该服务通过WhatsApp、Viber、微信、Telegram和NextPlus发送消息。过程如下所示: 说“好的,谷歌”,然后等待应用程序开始监听。 继续“向[联系人姓名]发送whatsapp消息,说[您的消息]”例如:“向Jeff发送whatsapp消息,说你好吗?”您将看到应用程序图标与您的消

  • 我正在阅读《Spring in Action4》一书,以使用WebSocket上的STOMP消息传递。 假设,如下所示: 然后客户端使用以下JavaScript代码订阅目标: 则该消息将发送到目的地,如下所示: 那么,两个目的地和看起来是不同的,消息怎么可能到达客户端呢?