一,准备过程 
远程过程调用RPC,基于XML的传输方式,当然低层API,就不用我们操心了,但必须的软件还是要有的,先给个列表清单 JDK1.4.2 不用说了 Xerces解析器  到http://xml.apache.org/上去下载吧, XML-RPC开发包, http://ws.apache.org/xmlrpc/上可以下得到 
将以上所有的jar包放到开发环境的classpath中。 
二,Hello World  
XML-RPC如果想跑起来,最后需要四个组件,WEB server, 服务器类,处理类,客户类 
1.WEB Server. 
在我们已经下载的XML-RPC包中就有一个轻型级的WEB SERVER。 在程序中,我们只需要简单的用以下语句就可以启动。 //建立一个对象,传输一个端口 WebServer server = new WebServer(Integer.parseInt("8989"));       //启动 server.start();  
2.编写处理类 
处理类相当RMI中的远程类,只不过在这里更轻量类,无须任何接口. 
在这个类中包含一个或多个公有方法以供远程的客户端来调用。 
public class HelloHandler { 
public String sayHello(String name) { return "Hello " + name; } 
 } 
 3.服务器 
负责调用以上代码来启动用服务器,同时还要将远程对象绑定到该服务器上。 
import java.io.IOException; //引入必须的包,当然你的xml-rpc的包应该在classpath中 import org.apache.xmlrpc.WebServer; import org.apache.xmlrpc.XmlRpc; public class HelloServer {  /** 主方法      */     public static void main(String[] args) {              try {             // 使用Xerces的XML解析器             XmlRpc.setDriver("org.apache.xerces.parsers.SAXParser");             // 给出提示,并在端8989上启动服务器             System.out.println("Starting XML-RPC Server...");             WebServer server = new WebServer(Integer.parseInt("8989"));                   server.start();                                // 将HelloHandler类的实例编定到WEB SERVER上,hello是该处理类的标识,在客户端调用时要用得到             server.addHandler("hello", new HelloHandler());             System.out.println(                 "Registered HelloHandler class to \"hello\"");                                                                      } catch (ClassNotFoundException e) {             System.out.println("Could not locate SAX Driver");         } catch (Exception e) {             System.out.println("Could not start server: " +                  e.getMessage());         }                                     } } 
4.客户端 根据“标识名.方法名“来定位远程的处理方法。 
import java.io.IOException; import java.net.MalformedURLException; import java.util.Vector; 
//导入必须的包 import org.apache.xmlrpc.XmlRpc; import org.apache.xmlrpc.XmlRpcClient; import org.apache.xmlrpc.XmlRpcException; 
 public class HelloClient {    
    public static void main(String args[]) {           String yourname="liu xiaobai";         try {             // 使用 Apache Xerces SAX 解析器             XmlRpc.setDriver("org.apache.xerces.parsers.SAXParser");                          // 定位远程服务器,http://主机地址:端口号, 8989是上文服务器启动时用的端口             XmlRpcClient client =                  new XmlRpcClient("http://localhost:8989/");                                // 创建调用请求,方法的参数列表如果一个Vector对象来存储。             Vector params = new Vector();                         params.addElement(yourname);                          // 发出请求,并返回结果,execute需要两个参数,第一个参数用“标识名.方法名”,第二参数是一个 刚刚建立的向量对象 
             String result =                 (String)client.execute("hello.sayHello", params);             System.out.println("Response from server: " + result);  
                            } catch (ClassNotFoundException e) {             System.out.println("Could not locate SAX Driver");         } catch (MalformedURLException e) {             System.out.println(                 "Incorrect URL for XML-RPC server format: " +                  e.getMessage());         } catch (XmlRpcException e) {             System.out.println("XML-RPC Exception: " + e.getMessage());         } catch (IOException e) {             System.out.println("IO Exception: " + e.getMessage());         }             }  } 
5,编译以上代码,要确保解析器,XMP-RPC开发包的jar文件在classpath中。 
运行服务器 
   java  HelloServer 
运行客户端 
  java HelloClient 
  
6.一个通用的XML服务器 
功能描述:通过配置文件来配置要加载的处理器 
1.配置文件的名称及位置 
名字:config.properties 
类文件的根目录中,如果你类是默认包,那么就是同一个目录;如果类的包名是com.hello,那么该文件应该与com目录放在同一级中。 
内容: 
#标识名=类名 hello=javaxml2.HelloHandler 
 2.通用的源代码 
import java.io.*; import org.apache.xmlrpc.*; import java.util.Properties; import java.util.Enumeration; import java.util.Hashtable; public class MyLightXMLServer {    private WebServer server;    private int port;    private String configfile;        public MyLightXMLServer(int port,String config)    {     this.port=port;     this.configfile=config;     }     //启动服务器     public void start() throws IOException,ClassNotFoundException,Exception     {      XmlRpc.setDriver("org.apache.xerces.parsers.SAXParser");      System.out.println("starting up xml-rpc server...");      server=new WebServer(port);      //调用注册函数      registerHandlers(this.getHandlers());      server.start();      }           public void registerHandlers(Properties handlers) throws Exception     {      Enumeration enum=handlers.propertyNames();      while(enum.hasMoreElements())      {       String temp=(String)enum.nextElement();       String tempcls=(String)handlers.get(temp);       Class cls=Class.forName(tempcls);       server.addHandler(temp,cls.newInstance());              }      }           public Properties getHandlers()     {      try      {        Properties properties=new Properties();        properties.load(new FileInputStream(new File("config.properties")));                 return properties;       }      catch(Exception e)      {       e.printStackTrace();       }      return null;      }          public static void main(String args[])     {      String port="8989";      String configfile="";      MyLightXMLServer server=new MyLightXMLServer(Integer.parseInt(port),configfile);      try      {       server.start();       }      catch(Exception e)      {e.printStackTrace();}      }            } 
将MyLightXMLServer .java编译并运行之后,该服务器会在配置文件中加载该处理器 
 然后可以直接执行HelloClient 
java HelloClient 
  
 
   
 
  |