我正在尝试使用Play Framework2.6来做以下事情:
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很容易做到这一点,但是文档对play 2.6的帮助不是很大。
谢谢
发布于 2018-12-12 04:15:25
在Akka actors的帮助下,我成功地实现了websocket。第一步,定义将处理消息执行元
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
public WebSocket ws() {
return WebSocket.Text.accept(request -> ActorFlow.actorRef((out) -> WebSocketActor.props(out), actorSystem, materializer));
}
根据source code的说法,ActorFlow使用flowActor
名字创建演员。因此,为了将消息发送到代码中某个位置的websockets,我们可以根据参与者的path找到参与者。这将向所有连接的客户端广播消息
actorSystem.actorSelection("/user/*/flowActor").tell("Hello", ActorRef.noSender());
不幸的是,我没有找到简单的方法来改变ActorFlow的默认名称,但也许这个答案可以帮助你play-scala-akka-websockets-change-actor-path。
你也可以从播放框架的例子中查看play-java-websocket-example项目。
https://stackoverflow.com/questions/53486314
复制相似问题