分享
 
 
 

[Boss Connector笔记]第2章 XML-RPC的HelloWorld实例

王朝java/jsp·作者佚名  2006-01-09
窄屏简体版  字體: |||超大  

*******************************************************

作者:陈刚,程序员,广西省桂林人,广西师范大学数学系97届毕业。

blog:http://blog.csdn.net/glchengang

Email:glchengang@yeah.net

*******************************************************

第2章 XML-RPC的HelloWorld实例2.1 前言经过研究以及和BOSS系统的开发方沟通,发现此BOSS系统是用纯HTTP+POST+XML的方式来进行信息沟通:XML是信息的载体、HTTP是传递的协议、POST是传递的方式。也就是说这和Web Service没什么关系。Web Service现在有两种不同实现SOAP和XML-RPC,XML-RPC(RPC是远程调用的意思)有一个开源的产品,其实现的低层也是基于HTTP+POST+XML的方式。我本来打算用纯Servlet就解决这个项目了,但老大说这样不行,可扩展性太差,因为福建是纯HTTP、也许广东就是SOAP或其他的方式,而且其中还存在一些构架设计等等方面的东东。

最后,我得到的要求和提示就是基于XML-RPC来实现这个项目,但XML-RPC是远程调用的方式,而福建BOSS并非远程调用,所以需要修改一下XML-RPC的源代码(老大花了一个下午改好了,而我花了一周多去研读和完整,水平不是一个数量级的呀,郁闷一下)。修改后的XML-RPC,在远程调用的实现外,再提供了一个纯HTTP+POST的现实方式。

注:本篇不涉及到修改XML-RPC的源代码。

2.2XML-RPC简介XML-RPC是Apache中Web Service方面的一个项目,官方网址:http://ws.apache.org/xmlrpc/,其中的RPC-remote procedure call是远程调用的意思,它本身是通过HTTP进行传输,用XML做传递信息的载体。XML-RPC是一个规范很简单的软件框架,也是Web Service的最早的实现,不过现在SOAP似乎比XML-RPC更流行。

上图反映了XML-RPC的转输方式:数据(DATA)和所要调用的方法被封装到一个XML中,然后由XML-RPC简单的HTTP+POST到服务端。服务端也装有XML-RPC来接收客户端的XML文件,并将接收到的XML信息进行分解,然后根据XML中记载的信息调用服务端的相应的方法。

2.3XML-RPC的下载1、我的环境

WindowsXP SP2 + JDK1.4.2_6 + Eclipse3.0.1

2、XML-RPC

l 版本:v1.2-b1

l 文件名:xmlrpc-1.2-b1.zip(下载后还要解压一下,得到xmlrpc-1.2-b1.jar)

l 下载:http://apache.justdn.org/ws/xmlrpc/

l 其它:为了追踪XML-RPC的代码执行过程,最好把它的源代码包一起下了,文件名:xmlrpc-1.2-b1-src.zip

3、SAX实现包:xerces

因为XML-RPC中设及到XML文件的解析等操作,它采用了SAX方式,所以它需要一个SAX实现包的支持。SAX的实现有很多种,我选择了xerces

l 版本:v1.4.4 (版本老了点,是2001年的,不过够用了)

l 文件名:Xerces-J-bin.1.4.4.zip(下载后还要解压一下,得到xerces.jar)

l 下载:http://xml.apache.org/dist/xerces-j/

2.4 Hello World实例我一直认为实例和代码是最好的说明,还是少说废话,先来个最简单的Hello World实例来体会一下吧。

2.4.1创建项目由于我用的是Eclipse,所以先创建一个普通的JAVA项目myxmlrpc,然后将xerces.jar 、xmlrpc-1.2-b1.jar复制到项目的lib目录。再创建一个包:cn.com.chengang.xmlrpc,以后就在此包下写程序。如下图:

2.4.2 创建服务端程序1、HelloServer

package cn.com.chengang.xmlrpc;

import org.apache.xerces.parsers.SAXParser;

import org.apache.xmlrpc.WebServer;

import org.apache.xmlrpc.XmlRpc;

public class HelloServer {

public static void main(String[] args) {

//使用Xerces的XML解析器

XmlRpc.setDriver(SAXParser.class);

System.out.println("启动一个WEB SERVER, 端口号:8989");

WebServer server = new WebServer(8989);

server.start();

//将HelloHandler类的实例绑定到WEB SERVER上,hello是该处理类的id标识,在客户端调用时要用得到

server.addHandler("hello_id", new HelloHandler());

}

}

说明:

这个文件主要是启动了一个Web Server,并将一个HelloHandler类加到server中。

2、HelloHandler

package cn.com.chengang.xmlrpc;

public class HelloHandler {

public String sayHello(String name) {

return "Hello World, " + name;

}

}

说明:

HelloHandler类不需要实现或继承任何接口抽象类,它的作用就是做为服务器端的处理程序,所有处理逻辑都在Handler类里来实现。我们可以写上很多的Handler类,并且一个Handler类里可以有很多的方法(这里有一个sayHello方法)。

2.4.3 创建客户端程序1、HelloClient

package cn.com.chengang.xmlrpc;

import java.io.IOException;

import java.util.Vector;

import org.apache.xerces.parsers.SAXParser;

import org.apache.xmlrpc.XmlRpc;

import org.apache.xmlrpc.XmlRpcClient;

import org.apache.xmlrpc.XmlRpcException;

public class HelloClient {

public static void main(String args[]) throws XmlRpcException, IOException {

//使用 Apache Xerces SAX 解析器

XmlRpc.setDriver(SAXParser.class);

//定位远程服务器

XmlRpcClient client = new XmlRpcClient("http:// 127.0.0.1:8989");

//创建调用请求,方法的参数列表用一个Vector对象来存储。

Vector params = new Vector();

params.addElement("ChenGang");

//发出请求,并返回结果,execute需要两个参数,第一个参数用“Handler的标识名.方法名”,第二参数是一个刚刚建立的向量对象

String result = (String) client.execute("hello_id.sayHello", params);

System.out.println("服务器的返回值: " + result);

}

}

说明:

l 客户端的程序比较简单,主要是通过XmlRpcClient类来将要调用的服务器端Handler的方法名(Handler的标识),及这个方法的参数(params),传递给服务端。

l 在这里127.0.0.1是指本机,因为服务端和客户端都是在本机运行的,共用同一台电脑。实际运行时,应该是分属在两台电脑上的,这时把127.0.0.1改成真实的服务器IP即可。

l 8989就是HelloServer类中启动Web Server的端口号。

l 有人说这里并没有看到XML文件的影子呀。其实client.execute("hello_id.sayHello", params);这一句已经封装了所有的处理过程,表面上它只是方法名和方法参数,但内部在处理时会将这两者处理成一个XML文件,然后POST到服务端。

l params.addElement("ChenGang");的参数不能是中文,否则报错。暂未找到解决方法。

2.4.4运行1、启动服务

以Application方式来运行HelloServer。Eclipse的“控制台”显示如下图:

2、运行客户端

以Application方式来运行HelloClient。Eclipse的“控制台”显示如下图:

2.5 XML-RPC原理分析2.5.1XML-RPC所传输的XML文件在上面的例程中说了,XML-RPC将远程方法的调用,实际是封装成一个XML文件传给服务器端的,那么我们就来看看这个XML的样子是怎么样的。

1、启动监听器

在上一篇所说的SOAP中有一个监听器,我们把它运行起来。这个监听器可以监听本机上发送到某一个端口的信息。这的监听器的入口类为TcpTunnelGui,启动此监听器的命令如下:

java org.apache.soap.util.net.TcpTunnelGui 8070 localhost 8989

如果报以下错误

Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/soap/util/net/TcpTunnelGui

这是因为soap.jar没有定义在classpath变量中,你可以将soap.jar加入到系统变量classpath,也可以在命令中用-cp参数临时指定soap.jar的位置。

java -cp "D:\soap-2_3_1\lib\soap.jar" org.apache.soap.util.net.TcpTunnelGui 8070 localhost 8989

这样所有发向8070端口的信息将被截获,然后这个监听器再把截获的信息转发到8989端口。此监听器的界面如下,左边是发出的信息,右边是从服务端接收的信息。

注意:HelloClient类中的服务器端口号要由8989改成8070。HelloServer还是原来的8989,不用改。

2、客户端发出的XML信息

POST / HTTP/1.1

Content-Length: 165

Content-Type: text/xml

Cache-Control: no-cache

Pragma: no-cache

User-Agent: Java/1.4.2_06

Host: 127.0.0.1:8070

Accept: text/html, image/gif, image/jpeg, *; q=.2, */*; q=.2

Connection: keep-alive

<?xml version="1.0" encoding="ISO-8859-1"?><methodCall><methodName>hello_id.sayHello</methodName><params><param><value>ChenGang</value></param></params></methodCall>

XML的信息是一行,我把它格式化一下,如下:

<?xml version="1.0" encoding="ISO-8859-1"?>

<methodCall>

<methodName>hello_id.sayHello</methodName>

<params>

<param>

<value>ChenGang</value>

</param>

</params>

</methodCall>

3、服务端返馈的信息

HTTP/1.1 200 OK

Server: Apache XML-RPC 1.0

Connection: close

Content-Type: text/xml

Content-Length: 144

<?xml version="1.0" encoding="ISO-8859-1"?><methodResponse><params><param><value>Hello World, ChenGang</value></param></params></methodResponse>

XML的信息是一行,我把它格式化一下,如下:

<?xml version="1.0" encoding="ISO-8859-1"?>

<methodResponse>

<params>

<param>

<value>Hello World, ChenGang</value>

</param>

</params>

</methodResponse>

2.5.2 客户端的处理流程

在HelloClient的代码中,我们看到是通过XML-RPC中的XmlRpcClient类来处理客户端的请求的,XmlRpcClient的内部处理逻辑如上,Worker是XmlRpcClient的一个内部类。Worker主要是将“要调用的远程方法以及方法参数”写成一个XML,XML文件的格式在上面“2.5.12、客户端发出的XML信息”已经给出了。

2.5.3服务器端的处理流程(省略)我修改的XML-RPC源代码不是这个版本的,而是从Apache的CVS上直接check下来的,最新的开发中,其设计已经发生了一些变化。比如,客户端的XML发送,原版是用HTTP+POST过去的,最新的则将它封成了一个接口:XmlRpcTransport,一个实现是HTTP+POST,另一个实现则是EMAIL的方式,这样扩展性就更大了。

2.6 参考资料xml-rpc入门例程及一个通用服务器(CSDN),地址:http://dev.csdn.net/develop/article/39/article/38/38300.shtm

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有