`
coolpep
  • 浏览: 80560 次
社区版块
存档分类
最新评论

xml-rpc入门例程及一个通用服务器

 
阅读更多

一,准备过程

远程过程调用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

分享到:
评论

相关推荐

    SmartCortex M3-1788配套例程及工程模板.

    这些工程模板通常包含了一个已经配置好的工程结构,开发者可以直接在模板基础上进行修改和扩展,减少了从零开始创建新工程的时间。 总的来说,"SmartCortex M3-1788配套例程及工程模板"是一份非常实用的资源,它...

    msp430f5438--例程--基础入门.rar

    msp430f5438--例程--基础入门.rar msp430f5438--例程--基础入门.rar msp430f5438--例程--基础入门.rar msp430f5438--例程--基础入门.rar

    LSM6DS3TR-C官网例程

    SPI则提供了更高的数据传输速率,但通常需要一个主控设备。这两种通信方式都需要在STM32的HAL库或LL库中配置相应的初始化函数,然后调用读写函数进行数据交换。 开发过程中,我们还需要关注传感器数据的处理。例如...

    西门子PLC例程-发动机控制例程-初学者入门例程.zip

    本教程“西门子PLC例程-发动机控制例程-初学者入门例程”是一个专为新手设计的学习资源,旨在帮助初次接触PLC编程的学员快速掌握如何使用西门子PLC进行发动机控制。 PLC编程主要基于梯形图(Ladder Diagram)语言,...

    用JAX-RPC构建Web服务.docx

    此外,JAX-RPC 是不受限制的:一个 JAX-RPC 客户可以访问不运行在 Java 平台的 Web 服务,反之亦然。JAX-RPC 的灵活性还在于它使用了 W3C 规定的技术:SOAP 和 Web 服务描述语言 (WSDL)。WSDL 为以消息形式的操作...

    中文编程-从入门到精通例程源码

    第一部分 易语言的基础知识 易语言的概述,编程环境与输入法的讲解,易语言数据类型的分类和使用,运算符和表达式的介绍,变量、常量的定义和使用, 资源的添加和使用,子程序的编写与调用。 第二部分 易语言的...

    S7-300实用例程

    **S7-300实用例程** 西门子S7-300系列是工业自动化领域广泛应用的可编程逻辑控制器(PLC),它以其...在深入探索每一个例程的过程中,你会发现西门子S7-300不仅是一个强大的工具,也是解决复杂自动化问题的有效平台。

    发动机控制例程-初学者入门例程.zip西门子PLC编程实例程序源码下载

    发动机控制例程-初学者入门例程.zip西门子PLC编程实例程序源码下载发动机控制例程-初学者入门例程.zip西门子PLC编程实例程序源码下载发动机控制例程-初学者入门例程.zip西门子PLC编程实例程序源码下载发动机控制例程...

    2.OneNET-V3.2-OneNET-裸机-基础例程_stm32_

    标题 "2.OneNET-V3.2-OneNET-裸机-基础例程_stm32_" 指示了这是一个基于STM32微控制器的OneNET平台的V3.2版本的基础程序实例。OneNET是中国移动物联网公司提供的一种云服务平台,它支持多种物联网设备的数据接入,...

    S7-1200_例程合集_V1

    同时,对于初学者,这些例程提供了一个直观的学习平台,通过模仿和修改现有代码,可以快速提升编程技能。对于有经验的工程师,这些例程则可以作为参考,为解决特定问题提供灵感。 因此,《S7-1200 PLC 例程合集_V1...

    西门子PLC程序源码-发动机控制例程-初学者入门例程.zip

    这个压缩包文件“西门子PLC程序源码-发动机控制例程-初学者入门例程.zip”显然是为那些刚开始接触PLC编程的学员准备的,旨在通过实际的发动机控制例子来教授基础编程知识。 西门子PLC的编程主要基于IEC 61131-3标准...

    工业机器人-发动机控制例程-初学者入门例程.7z

    这个"工业机器人-发动机控制例程-初学者入门例程"压缩包文件,显然是为那些希望进入这一领域的学习者准备的资源集合。 一、基础知识 1. 工业机器人:工业机器人是能够在预编程指令下自动执行任务的多功能机械装置,...

    arduino uno例程

    例程1-Hello World! 例程2-LED 闪烁 例程3-PWM调光 例程4-广告灯 例程5-交通灯 例程6-按键控制 例程7-抢答器 例程8-蜂鸣器 例程9-模拟值 例程10-光控声音 例程11-感光灯 例程12-温度传感 例程13-倾斜开关 例程14-...

    基于官方包改的ESP826612-12F例程

    这个例程可能是为了简化开发流程、增强功能或解决特定问题而设计的。 ESP8266-12F的核心是ESP8266芯片,它集成了32位的RISC处理器,支持TCP/IP协议栈,能够直接连接Wi-Fi网络,并与各种云服务进行通信。在硬件上,...

    opencv 超全学习资料,总共44个章节,每个章节都有可以正常运行的python-opencv源码例程和图片,非常好的资源!

    opencv 超全学习资料,总共44个章节,每个章节都有可以正常运行的python-opencv源码例程和图片,非常好的资源! opencv 超全学习资料,总共44个章节,每个章节都有可以正常运行的python-opencv源码例程和图片,非常...

    时间-事件鼓例程.zip西门子PLC编程实例程序源码下载

    时间-事件鼓例程.zip西门子PLC编程实例程序源码下载时间-事件鼓例程.zip西门子PLC编程实例程序源码下载时间-事件鼓例程.zip西门子PLC编程实例程序源码下载时间-事件鼓例程.zip西门子PLC编程实例程序源码下载 ...

    vtd-xml源码+例程

    这个压缩包包含了VTD-XML的C++源码和一些例程,对于想要深入理解VTD-XML工作原理或者进行二次开发的开发者来说,是一个非常宝贵的资源。 VTD(Variable Length Tokenized Document)XML是一种基于变量长度标记的XML...

    EM-LPC1788例程及使用手册

    05-MDK_Source可能是其中一个例程或相关资料,详细说明了如何在MDK环境下设置和运行LPC1788的项目。 总的来说,《EM-LPC1788例程及使用手册》是学习和开发基于LPC1788的嵌入式系统的重要参考资料,无论你是初学者...

    App-inventor-mqtt组件例程

    App_inventor_mqtt组件例程,内含mqtt组件,适用于mqtt协议接入阿里云或onenet云平台。 例程为连接阿里云平台,例程连接参数请自行修改,不要连接原参数。 教程链接:...

Global site tag (gtag.js) - Google Analytics