首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >使用play framework 2.6创建websocket

使用play framework 2.6创建websocket
EN

Stack Overflow用户
提问于 2018-11-27 01:36:07
回答 1查看 955关注 0票数 1

我正在尝试使用Play Framework2.6来做以下事情:

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

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

代码语言:javascript
复制
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很容易做到这一点,但是文档对play 2.6的帮助不是很大。

谢谢

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-12-12 04:15:25

Akka actors的帮助下,我成功地实现了websocket。第一步,定义将处理消息执行元

代码语言:javascript
复制
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的访问。定义将在新连接上创建actor的新实例的ActorFlow

代码语言:javascript
复制
public WebSocket ws() {
    return WebSocket.Text.accept(request -> ActorFlow.actorRef((out) -> WebSocketActor.props(out), actorSystem, materializer));
}

根据source code的说法,ActorFlow使用flowActor名字创建演员。因此,为了将消息发送到代码中某个位置的websockets,我们可以根据参与者的path找到参与者。这将向所有连接的客户端广播消息

代码语言:javascript
复制
actorSystem.actorSelection("/user/*/flowActor").tell("Hello", ActorRef.noSender());

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

你也可以从播放框架的例子中查看play-java-websocket-example项目。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53486314

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档