`
John_Kong19
  • 浏览: 279174 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

RPC(Remote Procedure Calls)

    博客分类:
  • GWT
阅读更多
Remote Procedure Calls
Rich Internet Applications (RIA)
JavaScript Object Notation (JSON)
在任何时候,只要你需要把代码运行在两个不同的地方,你就需要一种方法让它们之间相互通讯。最简单的方法是通过远程过程调用。
远程过程调用是一种简单的方法,客户端可以执行服务器上的一些逻辑并得到一个返回结果。
RMI,.NET Remoting,SOAP,REST和XML-RPC都是远程过程调用协议,但GWT不使用它们中任意一个。
1、GWT采用新协议的原因
(1)浏览器的调用是异步的;
(2)GWT的RPC需要简单化;
在首次使用时,浏览器下载所有的代码来开始应用程序,如果代码量大于100K,或许人们会感觉到一个停顿。而且,在浏览器上运行JavaScript往往是相当慢的。因此,执行一个复杂的协议如SOAP需要太多的代码下载,实际上太慢了。
(3)JavaScript不支持Java风格的序列化(串行化)类或动态类加载,因此GWT的RPC不能依靠它。
2、GWT RPC基础
GWT是以Java为中心的:客户端的Java被转化成JavaScript,服务器端的Java作为Java Servlet来运行。
(1)建立远程过程调用的第一步是定义一个模板来描述调用。
你需要做三次:客户端一次、服务器端一次、两者之间的共享接口一次。
例:假定你的客户端需要查看股票的价格。要预防非正式的通信,你应该允许它(客户端)一次请求几只股票的价格。因此,你需要一个方法来传递一个标记名数组,并返回double数组。让我们在接口中留住这个方法,调用StackService。你需要定义三个接口或类。
-------------------------------------------------------------------
名字                    位置                      目标
StockService接口        客户端和服务器端          描述服务
StockServiceImpl类      服务器端                  实际的代码
StockServiceAsync接口   客户端                    让你调用服务
-------------------------------------------------------------------
在Eclipse中建立RpcExample项目,使用脚手架工具,加入com.xyz.server包。
RpcProject/src/com/xyz/server/StockServiceImpl.java
-------------------------------
public class StockServiceImpl extends RemoteServiceServlet
          implements StockService{
  public double[] getPrices(String[] symbols){
    double[] result=new double[symbols.length];
    for(int i=0;i<symbols.length;i++){
      result[i]=getPrice(symbols[i]);
    }
    return result;
  }
}
-------------------------------
让我们来看所有的股价在400美元并且每次上涨1美元的股票。
RpcProject/src/com/xyz/server/StockServiceImpl.java
-------------------------------
pricate double price=400.0;
pricate synchronized double getPrice(String symbol){
  return price++;
}
-------------------------------
现在返回到客户端,这里是入口点(EntryPoint)类。
RpcProject/src/com/xyz/client/RpcExample.java
-------------------------------
public class RpcExample implements EntryPoint, ClickListener{
  private Button button=new Button("Click me");
  private HTML label=new HTML();
  private void onModuleLoad(){
    button.addClickListener(this);
    RootPanel.get("slot1").add(button);
    RootPanel.get("slot2").add(label);
  }
  //.......
}
-------------------------------
当点击按钮时,onClick()方法被调用。你实际上是向服务器发出请求。
RpcProject/src/com/xyz/client/RpcExample.java
-------------------------------
private String[] symbols={"GooG","MSFT","SUNW"};
public void onClick(Widget sender){
  //建立客户端代理。异步方式
  StockServiceAsync service=(StockServiceAsync)GWT.create(StockService.class);
  //指定URL
  ServiceDefTarget endpoint=(ServiceDefTarget)service;
  endpoint.setServiceEntryPoint(GWT.getModuleBaseURL()+"prices");
  //创建异步返回处理结果
  AsyncCallback callback=new AsyncCallback(){
    public void onSuccess(Object result){
      double[] prices=(double[]) result;
      updatePrices(symbols, prices);
    }
    public void onFailure(Throwable cauht){
      //生成一些UI东东来显示错误
    }
    //请求调用
    service.getPrices(symbols,callback);
  }
}
-------------------------------
StockServiceAsync和StockService接口可以手动的取得,通过一些工具(如Ruby脚本)从StockServiceImpl类得到。如下:
RpcProject/src/com/xyz/client/StockServiceAsync.java
-------------------------------
public interface StockServiceAsync{
  void getPrices(String[] symbols, AsyncCallback callback);
}
-------------------------------
RpcProject/src/com/xyz/client/StockService.java
-------------------------------
public interface StockService extends RemoteService{
  double[] getPrices(String[] symbols);
}
-------------------------------
现在来看第三步的onClick()方法。当getPrice()方法完成后,那么在AsyncCallback类的onSuccess()方法将被执行。这转变并调用一个名为updatePrices()的方法,它改变用户界面,显示出结果。如下定义:[iocblog.net 来源]
RpcProject/src/com/xyz/client/RpcExample.java
-------------------------------
private void updatePrices(String[] symbols, double[] prices){
  String html="";
  for(int i=0;i<symbols.length;i++){
    html+=symbols[i]+": "+prices[i]+"<br/>";
  }
  label.setHTML(html);
}
-------------------------------
当你运行程序并点击按钮时,并不发生任何事。主机shell将显示一条错误信息:
-------------------------------
[TRACE] The development shell servlet received a request for
    'prices' in module 'com.xyz.RpcExample'
[WARN] Resource not found: prices
-------------------------------
这是因为我们还没有部署servlet代码。在Web模式下,你需要部署StockServiceImpl servlet到容器中,如Tomcat。查看Servlet容器的文档弄清怎样做。
在主机模式下它是很容易的。你只需加它到组件定义(RpcExample.gwt.xml)中即可。
RpcProject/src/com/xyz/RpcExample.gwt.xml
-------------------------------
<!-- Specify the servlet class. -->
<servlet path="/prices" class="com.xyz.server.StockServiceImpl"/>
-------------------------------
现在重启应用程序,一切OK。
(2)Server-based State
每次你点击按钮时,价格将递增,即使你在不同的浏览器进行点击。这是因为一个servlet实例被所有的客户端所共享。要想不同的用户有不同的状态,你需要执行多种会话ID。
(3)Serialization 串行化
在早先的例子中,你递交了一系列字符串,返回了一系列double值。
就像RMI和.NET Remoting,你不用限制初始类型。任何类型均能作为一个参数串行化传递,并从远程调用返回结果。
要记住:GWT的串行化概念不同于Java的串行化概念。
GWT的串行化类型有:
  (1)is primitive, such as char, byte, short, int, long, boolean, float, or double;
  (2)is a primitive wrapper (Character, Byte, etc.);
  (3)is String or Date
  (4)is an array of serializable types (including arrays of arrays);
  (5)is a user defined class that contains only serializable fields, or implements the IsSerializable marker interface.
你使用的大多数简单类型和类都可以自动地被串行化,例如:
RpcProject/src/com/xyz/client/Rect.java
-------------------------------
public class Rect implements IsSerializable{
  private int height;
  private int width;
  //Must have a zero-rg constructor, or no constructor
  public Rect(){
  }
  public void setHeight(int height){
    this.height=height;
  }
  //...
}
-------------------------------
对于集合类如Set、List、Map和HashMap,你必须在JavaDoc中使用特殊的annotation类来告诉GWT编译器是哪种集合。例如:
RpcProject/src/com/xyz/client/MyClass.java
-------------------------------
public class MyClass implements IsSerializable{
  /**
   * This field is a Set that must always contain Strings.
   *
   * @gwt.typeArgs<java.lang.String>
   */
  public Set setOfStrings;
}
类似,注解参数和返回值:
RpcProject/src/com/xyz/server/MyService.java
-------------------------------
public interface MyService extends RemoteService{
  /**
   * The first annotation indicates that the parameter named 'c' is
   * a List that will only contain Integer objects. The second
   * annotation indicates that the returned List wil only contain
   * String objects (notice there is no need for a name, since it
   * is a return value).
   *
   * @gwt.typeArgs c <java.lang.Integer>
   * @gwt.typeArgs <java.lang.String>
   */
  List reverseListAndConvertToStrings(List c);
}
分享到:
评论

相关推荐

    Implementing Remote Procedure Calls

    远程过程调用(Remote Procedure Call,简称RPC)是一种通过网络在不同计算机之间进行通信的技术。它允许客户端应用程序通过网络调用服务器端的过程或函数,而无需了解底层网络协议细节。这种机制使得分布式系统的...

    rpc远程过程调用讲解与实例

    - `Remote Procedure Calls.doc`和`Remote Procedure Calls.pdf`:这些文档可能包含了RPC的详细理论解释,以及实现RPC服务的具体步骤和示例。它们可能详细阐述了如何编写客户端和服务器端的代码,以及如何处理RPC...

    RPC.rar_linux rpc pudn_remote_rpc实训平台

    《Remote Procedure Calls.doc》可能是对RPC技术的详细解释,包括其概念、工作流程以及优缺点。文档可能涵盖了RPC协议的四个主要组成部分:客户端、服务器端、RPC绑定和传输层。客户端是发起请求的一方,它调用一个...

    The Art of Distributed Applications -- SUN RPC

    The Art of Distributed Applications -- Programming Techniques for Remote Procedure Calls 1991 by Sun Microsystems, Inc RPC

    附件九-rpc论文译文.pdf

    《Implementing Remote Procedure Calls》译文,了解rpc机制的最佳方案。 本文描述一个提供了远程调用工具的软件包,面对这样一个软件包时一 个设计者拥有的选项,以及我们做出的选择。我们描述了我们的RPC机制的...

    j-jaxrpc_code.zip_RPC Client Java_jax

    **JAX-RPC:Java API for XML-based Remote Procedure Calls** JAX-RPC(Java API for XML-based Remote Procedure Calls)是Java平台上的一个标准接口,它允许开发者创建和使用基于XML的远程过程调用(RPC)服务。...

    进程间通信之共享内存C#源代码

    6.远程过程调用(Remote Procedure Calls, RPC) 7.Mailslot 8.报文传输协议(Message Transfer Protocol, MTP) 9.串行端口(Serial Ports) 10.内存映射文件(Memory-Mapped Files) 11.命名事件(Named Events) ...

    rpc,jax,Web Service....共享

    JAX是Java平台中处理XML的一系列API的统称,包括JAXP(Java API for XML Parsing)、JAXB(Java Architecture for XML Binding)和JAX-RPC(Java API for XML-based Remote Procedure Calls)。JAXP用于解析和生成...

    Java RPC通信机制之XML-RPC

    XML-RPC(Remote Procedure Call over XML)是一种轻量级的远程过程调用协议,它允许软件通过网络进行通信,调用远程服务器上的函数,就像调用本地函数一样。XML-RPC 使用 XML 来编码其调用结构,并使用 HTTP 作为...

    jax_rpc webservices hander头增加用户密码

    JAX-RPC(Java API for XML-based Remote Procedure Calls)是Java平台上的一个标准,它为创建和使用Web服务提供了简单且直观的API。本篇文章将深入探讨如何在JAX-RPC Web服务处理程序(handler)中添加用户密码,以...

    axis开发JAX-RPC webservice

    "Axis开发JAX-RPC WebService" 指的是使用Apache Axis框架来创建基于Java API for XML Remote Procedure Calls (JAX-RPC)的Web服务。这是一个古老但仍然有用的技术,用于构建分布式应用程序,使得不同系统之间可以...

    Automating.Junos.Administration.Doing.More.with.Less.1491928883.epub

    Manage Junos software with remote procedure calls and a RESTful API Represent devices as Python objects and manage them with Python’s PyEZ package Customize Junos software to detect and block commits...

    unix网络编程 卷2 带目录 英文 文字版

    5. RPC(Remote Procedure Calls):远程过程调用允许运行在一个操作系统上的程序,像调用本地程序一样调用另一个操作系统上的服务。 除此之外,书中还详细讲解了如何创建POSIX消息队列、读写锁和信号量的实现,这...

    SignalR Programming in Microsoft ASP.NET

    Use the simple ASP.NET API in SignalR for creating server-to-client remote procedure calls (RPC) that call JavaScript functions in client browsers from server-side .NET code. Exploit the API for ...

    jaxrpc.jar包

    `jaxrpc.jar`是Java应用程序中的一个重要组件,它主要用于实现Java API for XML Remote Procedure Calls(JAX-RPC)。JAX-RPC是Java平台上的一个标准,它提供了一种简单的方式来调用远程Web服务,就像调用本地方法...

    swoft 2框架使用rpc调用其他主机方法

    在分布式系统中,RPC(Remote Procedure Call)调用是常见的通信方式,允许不同主机间的进程相互通信,就像调用本地方法一样简单。在Swoft 2框架中,它提供了强大的RPC支持,使得开发者可以方便地实现远程调用。 在...

    axis-jaxrpc1.4

    标题“axis-jaxrpc1.4”所指的是一款名为Axis的Java XML Web服务框架中的一个组件,即JAX-RPC(Java API for XML-based Remote Procedure Calls)的1.4版本。Axis是Apache软件基金会开发的一个开源项目,主要用于...

    nfs服务搭建.pdf

    RPC(Remote Procedure Calls)定义了一种进程间通过网络进行交互通信的机制,允许客户端进程通过网络向远程服务进程请求服务,而不需要了解服务器底层的通信协议详细信息。NFS服务在与外部通信时依赖RPC来注册相应...

Global site tag (gtag.js) - Google Analytics