【问题标题】:Create websocket with play framework 2.6使用 play framework 2.6 创建 websocket
【发布时间】:2018-11-26 17:36:07
【问题描述】:

我正在尝试使用 Play Framework 2.6 执行以下操作:

  1. 浏览器以服务器为目标并创建了一个 websocket
  2. 稍后(在执行一些其他请求之后),服务器通过先前创建的 websocket 向浏览器发送消息

1) 可以通过路线轻松完成:

public WebSocket socket() {
    return WebSocket.Text.accept(request -> {
        // Log events to the console
        Sink<String, ?> in = Sink.foreach(System.out::println);

        // Send a single 'Hello!' message and then leave the socket open
        Source<String, ?> out = Source.single("Hello!").concat(Source.maybe());

        return Flow.fromSinkAndSource(in, out);
    });
}

并且websocket可以保存在服务器端。

2) 但是我怎样才能通过 websocket 发送数据呢? (触发服务器端)

这在 2.5 中很容易做到,但文档对玩 2.6 帮助不大。

谢谢

【问题讨论】:

    标签: websocket playframework


    【解决方案1】:

    我已经在Akka actors 的帮助下实现了 websocket。第一步定义将处理消息的actor

    public class WebSocketActor extends AbstractActor {
    
        private final ActorRef out;
    
        @Inject
        public WebSocketActor(ActorRef out) {
            this.out = out;
        }
    
        @Override
        public Receive createReceive() {
            return receiveBuilder()
                    .match(String.class, message ->
                            out.tell("Sending message at " + LocalDateTime.now().toString(), self())
                    )
                    .build();
        }
    
        public static Props props(final ActorRef out) {
            return Props.create(WebSocketActor.class, out);
        }
    }
    

    这个演员将按客户创建。 ActorRef out 将向连接的客户端发送消息。在此示例中,响应将针对传递给WebSocketActor 的每个字符串消息发送给客户端。

    现在定义 API 端点为客户端打开对 websocket 的访问。定义将在新连接上创建新演员实例的 ActorFlow

    public WebSocket ws() {
        return WebSocket.Text.accept(request -> ActorFlow.actorRef((out) -> WebSocketActor.props(out), actorSystem, materializer));
    }
    

    根据source codeActorFlow 创建具有flowActor 名称的演员。因此,要在代码中的某处向 websockets 发送消息,我们可以通过他们的path 找到演员。这将向所有连接的客户端广播消息

    actorSystem.actorSelection("/user/*/flowActor").tell("Hello", ActorRef.noSender());
    

    不幸的是,我没有找到简单的方法来更改 ActorFlow 默认名称,但也许这个答案可以帮助你play-scala-akka-websockets-change-actor-path

    您也可以从 playframework 示例中查看play-java-websocket-example 项目。

    【讨论】:

      猜你喜欢
      • 2018-03-09
      • 1970-01-01
      • 1970-01-01
      • 2018-02-23
      • 1970-01-01
      • 1970-01-01
      • 2018-04-30
      • 2018-07-31
      • 2018-02-18
      相关资源
      最近更新 更多