GWT - (客户端 --> 服务器 --> 客户端) 和 (服务器 --> 客户端) 通信之间的区别

GWT - Difference between (client --> server --> client) and (server --> client) communication

在我的 MVP 应用程序中,我有很多使用 GWT-RPC 的(客户端 --> 服务器 --> 客户端)通信。结构很简单,这里是一个客户端调用的例子。

        testObject.callToServer(example, new AsyncCallback<Void>(){
            @Override
            public void onFailure(Throwable caught) {
                //handle failure
            }
            @Override
            public void onSuccess(Object result) 
                //handle success
            }
         });

我的问题是,如果没有来自客户端的初始调用,我将如何只实现服务器到客户端的通信?我还能使用 RPC 吗?如果可以,我能以某种方式重用上面的代码示例吗?

更多信息,我正在使用 WebSockets 在 client/server 之间保持开放的通信 link。我正在尝试弄清楚如何通过网络发送不仅仅是字符串。我认识到 RPC 和 Websockets 是两种不同类型的通信,它们在单个通信实例中可能是互斥的。

至于我想发送什么样的数据,现在只是简单的POJO。

谢谢。

我使用 GWT 的 Autobean 框架实现了这一目标。

所有与服务器通信的方法都是'just strings over the wire'——与RPC的区别在于它是一种特殊格式的字符串,描述了被发送对象的类型、结构和内容。这些结构甚至在对话开始之前就已预定义 - 在服务器的 .class 文件中,并编译为 GWT 代码的 JS 格式。在你的应用程序中有一个共享的 .gwt.rpc 文件,它描述了每对 RPC 接口中可以使用哪些类型,这样双方就可以确定他们知道对方知道什么(具体来说,客户端名称该文件在每个请求中,如果可以找到,服务器同意使用该文件,否则抛出两者不同步的错误。

将对象放入其他形式的传输(如 websockets)需要将对象序列化为该字符串,并在另一端将它们读出。要在限制条件下正确使用 RPC,您必须启动预期的 'handshake',但由于 websockets 从客户端启动,这应该很容易完成。

在您的自我回答中,您提到您改用了 AutoBeans,让您可以简单地在接口中定义非常简单的类似 bean 的结构,并能够轻松地将它们映射到 JSON 字符串并再次映射回来.我还在 WebSockets 加 RPC 的服务器上完成了两个简单的实现,带有一个共享客户端实现:https://github.com/niloc132/webbit-gwt。该项目支持 JavaEE websockets 或 Webbit(使用 Netty 的 websocket 库)。它不完整或没有错误,但让你表现得好像任何一方(服务器或客户端)都可以自由调用另一方,使用 RPC-able 对象调用方法,并为 starting/stopping 套接字提供一些简单的钩子.