java - Play Framework 2.x : How to update a displayed view from server side?

标签 java playframework websocket playframework-2.0 server-sent-events

我在玩游戏时遇到了一些问题!框架。 该框架对我来说是新的,我第一次也是唯一一次使用它进行练习,就是本教程 here .

我有一个列出了一些数据的 View 。一个 Controller ,它有一个方法来显示 View ,另一个方法可以使用JSON接收一些数据。现在我想在收到新数据(JSON)时更新 View

我发现,我可以使用 comet 套接字websocket服务器发送事件来实现此目的。 (我无法选择永久的 AJAX 轮询。)

最好的方法是什么?

我尝试用websockets解决这个问题,但它不能按我想要的方式工作...

这是我的代码:

public class MyController extends Controller{   
    public static Result showMyView() {
        return ok(views.html.showMyView.render(Data.all()));
    }

    @BodyParser.Of(play.mvc.BodyParser.Json.class)
    public static Result jsonReceiver() {
        JsonNode json = request().body().asJson();
        String rcvData = json.findPath("someData").textValue();

        if(rcvData != null) {
            /*FLAG*/
            //SEND SOME DATA OVER THE WEBSOCKET FROM HERE?! ..To update the view
            //something like: out.write("Now from here!");
            return ok();
        } else {
            return badRequest();
        }
    }

    public static WebSocket<String> websocket() {
        return new WebSocket<String>() {

            public void onReady(WebSocket.In<String> in, WebSocket.Out<String> out) {
                out.write("Hello!");
            }
        };
    }
}

有没有办法从上面代码中的位置 /*FLAG*/ 通过套接字发送消息或其他数据?

我的观点如下:

@(dataContent: List[Data])
@main(title = "MyViews Observation Page") {
    @*
    SOME HTML CODE ...
    *@

<script type="text/javascript">
    var socket = new WebSocket("ws://" + location.host + "/path/to/my/websocket")

    socket.onmessage = function(event) {
        alert("Received: " + event.data); // only for testing... will be replaced later
    }
</script>
}

有人可以帮我吗?当收到新数据时,我不知道如何更新 View 。

如果您能根据我上面的示例代码来展示它,我将非常感激。 如果以不同的方式(comet 或服务器发送事件)更容易实现,我也非常感谢您提供示例。

在我之前的调查中,我发现了一些 cometd 和服务器发送事件的示例,但它们仅在 scala 中,我还没有理解它们。

我正在使用带有 java 的 play 框架 2.2.2。

最佳答案

每个客户端都会在您的服务器上生成一个 WebSocket.Out

将它们存储在List中,然后调用WebSocket.Out.write(objectNode)

public class MyController extends Controller{   
    //1. you store your client channels here
    private static ArrayList<WebSocket.Out> channels=new ArrayList<>();

    public static Result showMyView() {
        return ok(views.html.showMyView.render(Data.all()));
    }

    @BodyParser.Of(play.mvc.BodyParser.Json.class)
    public static Result jsonReceiver() {
        JsonNode json = request().body().asJson();
        String rcvData = json.findPath("someData").textValue();

        if(rcvData != null) {
           //3. you can write in your channels :)
           for(WebSocket.Out channel : channels){
               channel.write("blah");
           }

            return ok();
        } else {
             return badRequest();
        }
    }

    public static WebSocket<String> websocket() {
        return new WebSocket<String>() {

            public void onReady(WebSocket.In<String> in, WebSocket.Out<String> out) {
                  //2. each time a client connects, you save a reference to its channel
                  channels.add(out);
            }
        };
    }

}

关于java - Play Framework 2.x : How to update a displayed view from server side?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22836029/

相关文章:

javascript - NodeJS - 如何编写连接到 NodeJS 服务器并接收广播消息的客户端

java - Android:表行图像变胖并且不保持纵横比

scala - 如何将隐式 Action val 覆盖到 Play 框架 2 中

java - 使用哪个 playframework Json java 类?

java - 为什么 java.net.UnknownHostException 需要更改主机文件?

java - Jnlp 和 Browser 之间可以通信吗?

javascript - Socket.io 和 Express 不发送数据

java - 如何在android中自定义UI大小元素

java - 如何从 keyevent 方法调用文本字段变量?

java - 如何从 Eclipse 项目引用 jar?