用Java实现SOAP的XML文档网络传输及远程过程调用RPC
用Java实现基于SOAP的XML文档网络传输及远程过程调用(RPC)SOAP(Simple Object Access Protocol,简单对象访问协议) 是一种基于XML的,用于计算机之间交换信息的协议。
SOAP能应用于各种消息接发系统,并能通过各种传输协议进行消息传递,但最初的侧重点是通过HTTP传输的远程过程调用。
SOAP是Web service的一个重要组成部份,如果把Web service比喻成Internet,那么SOAP就可以比喻成TCP/IP。
SOAP是一种协议而非具体产品,微软也有自己的SOAP实现产品,而Java下比较流行的SOAP实现产品就是Apache SOAP,不过它的下一个版本已经改名成AXIS了。
SOAP是用XML文件来做为数据转输的载体的,走HTTP的线路。
一般企业的防火墙都开放HTTP的80端口,所以SOAP不会被防火墙阻断,这算是SOAP的一个优点。
信息转输的双方都要求支持SOAP服务,因为XML文件发过去,则对方需要有SOAP服务来接收,然后对方会有反馈也是XML文件,这时你也需要安装SOAP服务来接收。
1. 环境配置为了运行程序,我们首先必须配置好环境:共要下载四个软件包,它们都是开源免费的。
其中,前两个是Apache的,后两个是SUN 网站的,如下所示:⏹SOAP:2.3.1/⏹Xerces:⏹JavaMail:⏹JAF:下载后将它们分别解压缩。
分别在这四个包的解压目录中找到:xerces.jar、soap.jar、mail.jar、activation.jar(JAF的),则是四个jar文件是我们所需要的。
本机安装环境:WindowsXP(SP2) + JDK1.4.2_06 + Tomcat5.0.28 + SOAP2.3.1配置步骤:1、安装JDK和Tomcat。
过程比较简单,这里不再详述。
2、将刚才所找到的四个jar文件复制到Tomcat的“Tomcat 5.0\common\lib”目录下,这个目录是Tomcat的默认包目录,在这个目录中的所有包在Tomcat启动时都会被自动加载。
3、将\ JDK1.4.2\lib\路径下的tools.jar也复制到Tomcat的“Tomcat5.0\common\lib”目录下。
4、将soap解压目录的webapps目录下的soap.war文件,复制到Tomcat的“Tomcat5.0\webapps”目录下,这个目录是Tomcat的WEB应用所在目录。
重新启动Tomcat,Tomcat会自动将其解压,并配置好路径。
可以尝试在浏览器中输入“”,看SOAP是否安装好。
5、注意在编写程序时,需要将所得到的四个jar文件路径设置到所使用的Java编程环境中,因为在程序中需要用到其中的类文件。
具体步骤略。
6、重启Tomcat服务。
这时Tomcat会将“Tomcat 5.0\common\lib”目录下新加入的包加载到内存中。
到此,我们已经配置好了程序运行所需要的环境。
2. 基于SOAP的XML文档网络传输SOAP规范主要定义了四个元素:SOAP信封规范,传输和协议绑定,编码规则和一个RPC 协定。
用于实现消息的网络传输。
⏹SOAP信封规范,SOAP信封规范对计算机间传递的数据如何封装定义了具体的规则。
这包括应用特定的数据,如要调用的方法名,方法参数和返回值;还包括谁将处理封装内容,失败时如何编码错误消息等信息。
⏹数据编码规则,为了交换数据,计算机必须在编码特定数据类型的规则上达成一致,SOAP也有自己的一套编码数据类型的约定。
大部分约定都基于W3C XMLSchema规范。
⏹RPC协定,SOAP能用于单向和双向等各种消息接发系统。
SOAP为双向消息接发定义了一个简单的协定来进行远程过程调用和响应,这使得客户端应用可以指定远程方法名,获取任意多个参数并接受来自服务器的响应。
⏹传输和协议绑定,提供了更底层协议传输SOAP封套的一套通用机制。
而以上四个部分统称为一个SOAP消息。
我们先来看一篇XML文档是如何变成SOAP的。
采用一个简单的购物订单文件PO.xml 。
内容为:其对应的SOAP消息为:一个SOAP消息包括:SOAP封套,SOAP头(可选),SOAP主体。
我们首先将XML文档包装到一个SOAP体中,然后再把SOAP体包装到一个SOAP封套中,可以在封套中再添加一个SOAP头(不是必须),最后将SOAP封套绑定到一个协议中。
我们来仔细分析一下代码。
SOAP封套SOAP封套的声明在XML标签的最外层,它表明了一个SOAP文档的边界。
下面的封套标签显示了三个必要的属性,这些属性指明了封套中使用的名字空间和语法。
其中第一个属性:xmlns:SOAP-ENV="" 是一个名字空间声明,防止多个XML文件组合时发生标签名字的冲突。
第二个属性声明了XML模式实例的名字空间。
前缀xsi必须放在这个名字空间定义的所有元素和属性之前。
最后一个属性是另外一个名字空间声明,它定义了XML Schema名字空间,这个名字空间下的元素用来指定xsi:type 属性的值(如xsd:string)。
⏹SOAP头SOAP头和体在语法上非常类似。
SOAP1.1和SOAP1.2都没有头里应该有些什么,它就是简单的存放一些指令,提供给接收消息的SOAP处理器。
建立在SOAP之上的更高级协议(比如ebXML消息服务)就通过定义一些特殊元素来规范SOAP头的格式。
另外当对RPC使用SOAP 时,头部也可以用来表示一些底层信息。
⏹SOAP主体SOAP主体用来存放实际数据或消息的有效负载(本例中为XML文档),从而提供给最终的接受者使用或处理。
⏹SOAP协议绑定当绑定到一个HTTP协议时,需要在SOAP封套前面添加HTTP头的信息。
在SOAP1.1中SOAPAction是HTTP绑定所必须的部分,它的目的是让那些路由或分派的信息知道该做些什么,即使它们根本不知道SOAP或者没有解析SOAP封套的方法。
而在SOAP1.2中SOAPAction已变成可选的了。
SOAP消息的发送与接收我们已经看到了一个SOAP消息的各个组成块,接下来我们要了解消息是怎样被创建的,以及怎样在两个端点之间进行传输的。
SOAP的发送端的代码:在上述程序中,当我们构造好SOAP封套后,它需要被送到一个目的地去。
在ApacheSOAP 中,有一个Message对象来处理异步的单向传送。
Message.send()方法有三个参数:一个URL,用于指明传送地点;一个URI,用于表示SOAPAction头的值;还有一个SOAP封套。
SOAPActionURI实际上是绑定HTTP的一部分,用来指定当一个消息到达传送目的地的时候调用哪个函数或服务。
Message接口用于异步单向通信,Message.seng()函数的返回值为void型。
但这并不妨碍它在双向同步会话中使用。
当这个Message接口是基于一个双向传输协议(例如HTTP)实现的时候,SOAPTransport.receive()方法就能用来接收一个响应。
在SOAPTransport是基于HTTP实现的情况下,receive()方法阻塞并等待一个错误(例如一个HTTP请求超时),或者一个正确的返回代码(例如“HTTP 1.0 200 OK”)。
SOAP接收端代码:带附件的SOAP消息XML和SOAP能够很好的描述数据,但是许多应用程序的数据并不适合XML来描述,比如图像的二进制数据。
SWA(SOAP With Attachments)可以解决这个问题。
SWA把SOAP协议和MIME格式组合到一起,从而使SOAP消息可以包含任意的数据。
这个模型和在email 中包含附件的方法是一样的。
MIME协议允许在消息中包含任意多个数据块。
每个数据块都被一个MIME头分开。
在SWA 中,整个消息包含多个MIME部分,第一部分(部分0)是SOAP封套,剩下的部分(1- n)都是附件。
所有这些部分都包装在底层协议中。
构造带附件的SOAP:SOAP封套的创建和组装和以前一样,消息的创建议和以前一样。
下面给出心田代码,它创建一个MimeBodyPart对象,然后我们从附件中读出文本作为它的内容体(假定附件为一个TXT文本文件)。
接下来,我们需要让接收端能够引用附件。
为了使接收端能够分析这个消息,我们在XML文档中添加了一个元素,它用the-attachment作为href的值。
我们用这个值作为附件的content-id.最后,我们在消息中添加附件部分然后发送。
Apache SOAP会知道你在消息中添加了附件,并且会正确的转化为消息格式:接收带附件的SOAP:我们通过XML文档中的<attachment href=“cid:the-attachment”/>元素来查找附件。
首先我们通过名字查找〈attachment>元素。
然后我们取出href属性中的content-id的值。
一旦我们得到了id,就能够使用SOAPContext对象中的getBodyPart()方法,通过content-id来查找MIME附件。
3. 基于SOAP的远程过程调用(RPC)SOAP-RPC使用SOAP底层结构定义了一个用来表示RPC以及RPC响应的模型。
它并不要求一定要紧紧地绑定一个同步的请求/响应模型或者一个HTTP协议。
实际上SOAP1.1和1.2规范都明确声明了SOAP-RPC的使用和协议的绑定是无关的。
规范承认,当SOAP-RPC 绑定到HTTP时,RPC调用就自动和HTTP请求相匹配,但是这个匹配纯粹是偶然的。
因此真正重要的是SOAP定义了一个统一的模型,来表示RPC及其一个或多个返回值。
RPC调用的基本要求是,体元素包含方法名和参数,并且参数可以通过存取方法来访问。
SOAP还提供了对方法签名,头数据和代表目的地的URI进行编码的方法。
我们先来看一个SOAP-RPC的发送端内容:可以看到,在封套体内包含了方法名以及过程调用所需的参数。
如在这个SOAP消息中,<ns1:getPriceList>是自动产生的标签,它代表方法名。
<sku>参数用xsi:type="ns2:Array"类型表示。
⏹SOAP-Encoding属性SOAP编码是一套规则,说明线路上传输的数据类型如何进行编码或者序列化。
在上面这个消息中,encodingStyle属性值设为""。
这个特定的URL定义了基于SOAP1.1模式的编码规则。
SOAP编码包括了序列化任何数据类型的规则,从简单的标量类型到复杂的数据类型。
⏹SOAP-RPC方法签名方法签名只是简单的声明〈body〉元素包含一个SOAP结构。
java soap调用
Java SOAP调用SOAP(Simple Object Access Protocol)是一种用于在网络上交换结构化信息的协议。
它基于XML,用于在Web服务之间进行通信。
Java可以使用SOAP协议来调用远程的Web服务。
本文将介绍如何使用Java调用SOAP服务,并提供一些示例代码和最佳实践。
目录•SOAP简介•Java SOAP调用的步骤–生成SOAP客户端代码–创建SOAP连接–构建SOAP请求–发送SOAP请求–解析SOAP响应•示例代码•最佳实践•总结SOAP简介SOAP是一种基于XML的通信协议,用于在网络上进行结构化数据的交换。
它定义了一种标准的消息格式和通信协议,使得不同平台和编程语言之间的应用能够相互通信。
SOAP消息由一个envelope元素包围,其中包含一个header元素和一个body元素。
header元素用于传递一些元数据,而body元素用于传递实际的数据。
SOAP协议通常使用HTTP作为传输协议,但也可以使用其他协议,如SMTP、FTP等。
Java SOAP调用的步骤要在Java中调用SOAP服务,需要以下步骤:1. 生成SOAP客户端代码首先,需要根据SOAP服务的WSDL(Web Services Description Language)文件生成SOAP客户端代码。
WSDL文件描述了SOAP服务的接口和方法。
可以使用Java的工具,如wsimport命令或Apache CXF框架来生成SOAP客户端代码。
生成的代码将包含用于调用SOAP服务的Java类和方法。
2. 创建SOAP连接在Java中,可以使用JAX-WS(Java API for XML Web Services)或Apache CXF等工具来创建SOAP连接。
使用JAX-WS,可以通过创建一个javax.xml.ws.Service对象来创建SOAP连接。
需要提供WSDL文件的URL和服务名称作为参数。
java中xml进行报文发送和解析操作
java中xml进⾏报⽂发送和解析操作利⽤OKhttp⽹络框架,进⾏Maven项⽬管理//报⽂发送<dependency><groupId>com.squareup.okhttp3</groupId><artifactId>okhttp</artifactId><version>3.8.0</version></dependency>//报⽂解析<dependency><groupId>xom</groupId><artifactId>xom</artifactId><version>1.2.5</version></dependency>报⽂⽰例<STUDENT><AGE>18</AGE><NAME><XING>赵</XING><MING>明⽟</MING></NAME><NAME><XING>沙</XING><MING>明德</MING></NAME></STUDENT>报⽂拼接StringBuffer strBuff = new StringBuffer();strBuff.append("<STUDENT>");strBuff.append("<AGE>18</AGE>");strBuff.append("<NAME>");strBuff.append("<XING>赵</XING>");strBuff.append("<MING>明⽟</MING>");strBuff.append("</NAME>");strBuff.append("<NAME>");strBuff.append("<XING>沙</XING>");strBuff.append("<MING>明德</MING>");strBuff.append("</NAME>");strBuff.append("</STUDENT>");String xmlStr = strBuff.toString;报⽂发送,post请求接⼝调⽤,xmlStr为xml格式请求参数体public String postXml(String xmlStr){//可改变请求参数体编码GBK/UTF-8RequestBody body= RequestBody.create(MediaType.parse("application/xml;charset=GBK"), xmlStr);//url为接⼝地址Request requestOk = new Request.Builder().url("http://192.168.0.103:8007").post(body).build();//⽹络请求OkHttpClient client = new OkHttpClient.Builder().retryOnConnectionFailure(true).build();//可⼿动设置连接时长OkHttpClient client = new OkHttpClient().newBuilder().connectTimeout(60000, LISECONDS).readTimeout(60000, LISECONDS).build();//获取处理结果Response response = null;try {response = client.newCall(requestOk).execute();} catch (IOException e) {e.printStackTrace();}//获取响应String jsonString = response.body().string();return jsonString;}报⽂解析,进⾏实体解析//STUDENT为XML最⼤节点JAXBContext context = JAXBContext.newInstance(STUDENT.class);Unmarshaller unmarshaller = context.createUnmarshaller();//jsonString为报⽂响应STUDENT student = (STUDENT)unmarshaller.unmarshal(new StringReader(jsonString));实体类//XmlRootElement注解是将类与XML元素进⾏映射,XML节点与属性⼤⼩写保持⼀致@XmlRootElement(name ="STUDENT")public class STUDENT implements Serializable {private String AGE;private List<NAME> NAME;public String getAGE() {return AGE;}public void setAGE(String AGE) {this.AGE = AGE;}public List<NAME> getNAME() {return NAME;}public void setNAME(List<NAME> NAME) { = NAME;}@Overridepublic String toString() {return "Cccc{" +"AGE='" + AGE + '\'' +", NAME=" + NAME +'}';}}补充知识:Java发送内容为xml格式请求并解析返回json结果封装成静态请求⽅法:import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;import java.io.OutputStreamWriter;import .ConnectException;import .MalformedURLException;import .URL;import .URLConnection;/*** 发送HTTP的⼀种⽅法* GaoLiang*/public class HttpSendUtil {public static String xmlPost(String urlStr, String xmlInfo) {try {URL url = new URL(urlStr);URLConnection con = url.openConnection();con.setDoOutput(true);// con.setRequestProperty("Pragma:", "no-cache");// con.setRequestProperty("Cache-Control", "no-cache");// ⼀定要设置报⽂格式,否则发送失败con.setRequestProperty("Content-Type", "text/xml");OutputStreamWriter out = null;try {out = new OutputStreamWriter(con.getOutputStream());} catch (ConnectException e) {// e.printStackTrace();return "Connection refused";}// System.out.println("urlStr=" + urlStr);// System.out.println("xmlInfo=" + xmlInfo);out.write(new String(xmlInfo.getBytes("ISO-8859-1")));out.flush();out.close();BufferedReader br = new BufferedReader(new InputStreamReader(con.getInputStream()));StringBuilder stringBuilder = new StringBuilder();String line = "";for (line = br.readLine(); line != null; line = br.readLine()) {// System.out.println(line);stringBuilder.append(line);}return stringBuilder.toString();} catch (MalformedURLException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}return null;}在外部调⽤静态⽅法:// 请求的xml服务地址String url = url;// 请求参数由于是⼿动拼写的参数很长看起来也不美观就不放了(⼿动哭脸)String param = "" ;// 发送请求调⽤上⾯的静态⽅法String ret = xmlPost(url,param);// 得到的是xml格式的返回结果但是⾥⾯的“<”,“>”都是“<”,“>”显⽰所以就需要解析,具体解析见下表ret = ret.replaceAll("<", "<");ret = ret.replaceAll(">", ">");ret = ret.replaceAll("&", "&");ret = ret.replaceAll(""", "\"");ret = ret.replaceAll("'", "\'");// 因为接⼝最终要返回的是json格式所以还要把想要的值取出来解析成String// 解析拿到节点⾥想要的值Document document = DocumentHelper.parseText(ret);// 根节点这⾥不⼀定要和根节点取⼀样的名字可⾃定义这么写是⽅便理解Element root = document.getRootElement();// root节点下的⼦节点Element business = root.element("business");//解析完取到business节点下的值String healthCode = business.getStringValue();// 拼接返回值Map<String,Object> thisResult = new HashMap();thisResult.put("healthCode",healthCode);resultList.add(thisResult);// 统⼀返回值Map<String,Object> returnset = new HashMap<>();xml解析五种格式:补充⼀下:xml返回结果类似于这样<?xml version="1.0" encoding="utf-8" ?><Root><business>我想要的值:healthCode</business ></Root>最后,由于时间⽐较匆忙,⼜没有接触过xml格式请求,确实折磨了我⼀阵⼦时间,搜了好多⼤神写的博客,最终整理出⾃⼰的。
java rpc调用实例
java rpc调用实例Java RPC调用实例RPC(Remote Procedure Call)是一种远程过程调用的通信协议,它可以使得程序在不同的计算机上通过网络进行通信和交互。
Java作为一种广泛使用的编程语言,也提供了丰富的支持来实现RPC调用。
在本文中,我们将通过一个具体的示例来介绍Java中的RPC调用。
1. 准备工作在开始之前,我们需要进行一些准备工作。
首先,我们需要有两台计算机,一台作为服务端,一台作为客户端。
其次,我们需要安装Java开发环境(JDK)并配置好环境变量。
2. 定义接口首先,我们需要定义一个接口,用于指定远程调用的方法。
假设我们要实现一个简单的计算器服务,可以进行加法和乘法运算。
我们可以创建一个名为CalculatorService的接口,其中包含add和multiply两个方法:javapublic interface CalculatorService {int add(int a, int b);int multiply(int a, int b);}3. 实现服务端接下来,我们需要实现服务端的代码。
在这个例子中,我们使用Java中的RMI(Remote Method Invocation)来实现RPC调用。
RMI是Java中用于实现远程对象调用的机制。
首先,我们需要创建一个CalculatorServiceImpl类来实现CalculatorService接口:javaimport java.rmi.RemoteException;import java.rmi.server.UnicastRemoteObject;public class CalculatorServiceImpl extends UnicastRemoteObject implements CalculatorService {protected CalculatorServiceImpl() throws RemoteException {super();}@Overridepublic int add(int a, int b) {return a + b;}@Overridepublic int multiply(int a, int b) {return a * b;}然后,我们可以创建一个服务端类CalculatorServer来启动服务并注册对应的远程对象:javaimport java.rmi.Naming;import java.rmi.registry.LocateRegistry;public class CalculatorServer {public static void main(String[] args) {try {CalculatorService calculator = new CalculatorServiceImpl();LocateRegistry.createRegistry(1099);将远程对象绑定到对应的RMI注册表中Naming.rebind("localhost/CalculatorService", calculator);System.out.println("Server started.");} catch (Exception e) {System.err.println("Server exception: " +e.toString());e.printStackTrace();}}在这段代码中,我们首先创建了一个CalculatorServiceImpl对象实例,然后创建一个RMI注册表并将CalculatorServiceImpl对象绑定到该注册表中。
java rpc 方法
java rpc 方法===========一、介绍----RPC,即远程过程调用(Remote Procedure Call),是一种常见的编程范式,允许在两个不同的地方调用相同的数据结构和控制流程。
在Java环境中,使用RPC可以实现组件之间的解耦,提高系统的可扩展性和可维护性。
本篇文档将介绍Java中常见的RPC方法及其实现。
二、几种常见的Java RPC方法-------------1. **Java RMI(远程方法调用)**:Java RMI是Java提供的用于在不同Java虚拟机(JVM)之间进行通信的一种机制。
它允许远程对象调用在客户端代码中定义的方法。
2. **HTTP/RESTful API**:使用HTTP协议进行通信,通过定义一系列的HTTP方法(如GET、POST、PUT、DELETE等)来实现RPC调用。
Java中常用的框架如Spring MVC、Jersey等可以方便地实现RESTful API。
3. **gRPC**:gRPC是Google开发的一种高性能、开源的RPC框架,它支持多种语言,包括Java。
通过gRPC,可以在不同的系统之间进行高性能、高可靠性的通信。
4. **Thrift**:Thrift是一种跨语言的远程服务调用(RPC)框架,它支持多种编程语言,包括Java。
使用Thrift,可以很方便地定义服务接口,并生成相应的客户端和服务器代码。
5. **Dubbo**:Dubbo是阿里巴巴开源的一个高性能、轻量级的RPC框架,它支持多种通信协议和传输层协议,如HTTP/HTTPS、RMI、Kafka等,同时也支持负载均衡和容错。
三、Java RPC方法实现示例------------### 1. Java RMI示例首先,我们需要定义一个远程接口:```javainterface RemoteService extends Remote {void remoteMethod();}```接着,我们需要实现这个接口,并在服务器端注册这个远程对象:```javapublic class RemoteServiceImpl extends UnicastRemoteObject implements RemoteService {public RemoteServiceImpl() throws RemoteException { // 默认端口为1099,也可指定其他端口号}public void remoteMethod() {// 方法实现代码}}```在客户端,我们可以创建这个远程对象的引用并调用方法:```javaRemoteService remoteService = new RemoteServiceImpl(); // 创建远程对象引用remoteService.remoteMethod(); // 调用远程方法```### 2. HTTP/RESTful API示例(使用Spring MVC)首先,我们需要定义一个RESTful接口:```java@RestControllerpublic class RemoteServiceController {@GetMapping("/remoteMethod")public String remoteMethod() {// 方法实现代码return "远程方法调用成功";}}```然后,我们需要在前端发起HTTP请求来调用这个接口。
rpc 远程调用原理和实现
rpc 远程调用原理和实现RPC(Remote Procedure Call,远程过程调用)是一种用于实现跨网络通信的技术,它允许程序在不同的计算机或进程之间进行函数调用,就像是本地调用一样。
下面是RPC的原理和实现方式:原理:1. 客户端发起RPC调用:客户端以本地调用的方式调用远程服务的接口方法。
2. 序列化参数:客户端将调用方法的参数序列化为字节流,以便在网络上传输。
3. 网络传输:客户端通过网络将序列化后的参数数据发送给远程服务器。
4. 反序列化参数:服务器接收到请求后,将接收到的字节流反序列化为方法的参数。
5. 执行远程方法:服务器根据接收到的参数执行相应的方法,并得到结果。
6. 序列化返回值:服务器将方法执行的结果序列化为字节流。
7. 网络传输:服务器将序列化后的结果通过网络传输给客户端。
8. 反序列化返回值:客户端接收到结果后,将字节流反序列化为方法的返回值。
9. 返回结果:客户端将方法的返回值返回给调用者。
实现方式:1. 定义接口:首先需要定义客户端和服务器之间通信的接口,包括方法名、参数和返回值等。
2. 生成桩代码和存根代码:客户端和服务器分别生成桩代码和存根代码,用于在本地进行序列化和网络传输操作。
3. 序列化和反序列化:客户端将调用方法的参数进行序列化,服务器将接收到的字节流反序列化为方法的参数。
同样,服务器将方法执行结果序列化,客户端将接收到的字节流反序列化为方法的返回值。
4. 网络通信:客户端和服务器通过网络通信将序列化后的数据进行传输,可以使用TCP、HTTP等协议。
5. 调用远程方法:服务器根据接收到的请求,执行相应的方法,并返回结果给客户端。
常见的RPC框架有Dubbo、gRPC和Thrift等,它们提供了一套完整的RPC实现,并封装了底层网络传输、序列化和反序列化等细节,简化了开发过程。
开发者只需要定义接口和实现服务,就能够方便地进行跨网络的函数调用。
java rpc远程过程调用原理
java rpc远程过程调用原理Java RPC(Remote Procedure Call)远程过程调用是一种允许一台计算机(客户端)调用另一台计算机(服务器)上的程序或方法的技术。
这种技术使得客户端和服务器可以共享服务,从而实现了分布式系统的通信和协作。
Java RPC 的原理主要包括以下几个步骤:1. 定义接口:首先,需要定义一个接口,该接口包含了一些方法声明,这些方法将在远程服务器上实现。
2. 实现服务端:在服务器端,需要实现这个接口,并处理客户端的请求。
服务器端通常会监听一个特定的端口,等待客户端的请求。
3. 序列化:当客户端想要调用服务器上的方法时,它需要将请求和参数发送到服务器。
为了能够正确地传输数据,参数需要被序列化(转化为二进制格式)。
Java 提供了一些工具类(如ObjectOutputStream)来实现序列化。
4. 网络传输:客户端将序列化后的数据发送给服务器。
这个过程通常通过TCP/IP 协议完成。
5. 反序列化:当服务器收到数据后,需要将序列化的数据反序列化(从二进制格式转回原来的格式)。
Java 提供了一些工具类(如ObjectInputStream)来实现反序列化。
6. 执行方法:服务器反序列化数据后,会找到对应的方法并执行它,然后将结果返回给客户端。
7. 返回结果:服务器将执行结果序列化后通过网络发送给客户端。
8. 客户端接收结果:客户端收到序列化的结果后,将其反序列化为原来的格式并处理。
这就是 Java RPC 的基本原理。
实际的实现可能会更复杂,例如需要考虑安全性、性能优化、异常处理等问题。
此外,也有一些成熟的框架(如Apache Thrift、gRPC 等)可以帮助我们更方便地实现 Java RPC。
用Java实现SOAP的XML文档网络传输及远程过程调用RPC
用Java实现基于SOAP的XML文档网络传输及远程过程调用(RPC)SOAP(Simple Object Access Protocol,简单对象访问协议) 是一种基于XML的,用于计算机之间交换信息的协议。
SOAP能应用于各种消息接发系统,并能通过各种传输协议进行消息传递,但最初的侧重点是通过HTTP传输的远程过程调用。
SOAP是Web service的一个重要组成部份,如果把Web service比喻成Internet,那么SOAP就可以比喻成TCP/IP。
SOAP是一种协议而非具体产品,微软也有自己的SOAP实现产品,而Java下比较流行的SOAP实现产品就是Apache SOAP,不过它的下一个版本已经改名成AXIS了。
SOAP是用XML文件来做为数据转输的载体的,走HTTP的线路。
一般企业的防火墙都开放HTTP的80端口,所以SOAP不会被防火墙阻断,这算是SOAP的一个优点。
信息转输的双方都要求支持SOAP服务,因为XML文件发过去,则对方需要有SOAP服务来接收,然后对方会有反馈也是XML文件,这时你也需要安装SOAP服务来接收。
1. 环境配置为了运行程序,我们首先必须配置好环境:共要下载四个软件包,它们都是开源免费的。
其中,前两个是Apache的,后两个是SUN 网站的,如下所示:⏹SOAP:2.3.1/⏹Xerces:⏹JavaMail:⏹JAF:下载后将它们分别解压缩。
分别在这四个包的解压目录中找到:xerces.jar、soap.jar、mail.jar、activation.jar(JAF的),则是四个jar文件是我们所需要的。
本机安装环境:WindowsXP(SP2) + JDK1.4.2_06 + Tomcat5.0.28 + SOAP2.3.1配置步骤:1、安装JDK和Tomcat。
过程比较简单,这里不再详述。
2、将刚才所找到的四个jar文件复制到Tomcat的“Tomcat 5.0\common\lib”目录下,这个目录是Tomcat的默认包目录,在这个目录中的所有包在Tomcat启动时都会被自动加载。
java集成soap简书
Java集成SOAP简述一、SOAP简介SOAP(Simple Object Access Protocol)是一种基于XML的通信协议,用于在网络上进行远程过程调用(RPC)。
它使用标准的HTTP协议进行通信,可以在不同的操作系统、编程语言和网络环境中进行交互。
SOAP消息由XML构成,具有良好的可读性和可扩展性。
它允许不同的应用程序通过网络进行通信,使用SOAP消息传递数据、调用远程方法,并获取返回结果。
二、Java集成SOAPJava提供了丰富的API和工具,用于集成SOAP协议。
在Java中,我们可以使用以下几种方式来实现SOAP通信:1. JAX-WSJAX-WS(Java API for XML Web Services)是Java EE平台的一部分,提供了一套用于开发和部署Web服务的API。
它使用标准的SOAP协议进行通信,支持WSDL (Web Services Description Language)描述和生成工具。
使用JAX-WS,我们可以通过创建Java类和注解来定义Web服务,然后使用工具生成WSDL描述文件。
客户端可以根据WSDL文件生成相应的Java客户端代码,以便调用远程方法。
2. Apache AxisApache Axis是一个开源的SOAP引擎,用于构建和部署基于SOAP的Web服务。
它提供了一组API和工具,用于开发和集成SOAP服务。
使用Apache Axis,我们可以通过创建Java类和配置文件来定义Web服务。
然后,我们可以使用Axis提供的工具生成WSDL描述文件,并将Web服务部署到应用服务器上。
3. Apache CXFApache CXF是一个开源的Web服务框架,支持SOAP、REST和其他Web服务协议。
它集成了Apache Axis和XFire两个项目的优点,提供了一套强大的API和工具,用于开发和部署Web服务。
使用Apache CXF,我们可以通过创建Java类和注解来定义Web服务。
soap 连结方式
SOAP 连结方式SOAP(Simple Object Access Protocol)是一种基于 XML 的协议,用于在网络上进行应用程序之间的通信。
它提供了一种标准化的方式,使得不同平台上的应用程序能够相互交互和通信。
本文将介绍 SOAP 连结方式的基本原理、使用场景以及一些相关的工具和技术。
SOAP 基本原理SOAP 是一种基于文本的协议,它使用 XML 来编码消息。
SOAP 消息由一个包含方法调用和参数的 XML 文档组成。
这些消息可以通过 HTTP、SMTP、FTP 等不同的传输协议来传送。
在 SOAP 消息中,方法调用和参数被封装在<Envelope>元素中,并使用<Body>元素进行包装。
SOAP 还支持使用<Header>元素添加一些可选的头部信息。
SOAP 的基本原理可以概括为以下几个步骤:1.客户端构建 SOAP 请求消息,包含要调用的方法和相应的参数。
2.客户端将 SOAP 请求消息发送给服务端。
3.服务端接收到 SOAP 请求消息后,解析出方法和参数。
4.服务端执行相应的方法,并生成 SOAP 响应消息。
5.服务端将 SOAP 响应消息发送给客户端。
6.客户端接收到 SOAP 响应消息后,解析出结果。
SOAP 使用 XML 来描述消息的结构和内容,这使得它具有很好的可读性和可扩展性。
SOAP 还支持使用 WSDL(Web Services Description Language)来定义 Web 服务的接口和协议。
SOAP 的使用场景SOAP 的使用场景主要包括以下几个方面:1. Web 服务SOAP 是 Web 服务的核心协议之一。
通过使用 SOAP,开发人员可以轻松地构建跨平台、跨语言的 Web 服务。
SOAP 提供了一种标准化的方式,使得不同平台上的应用程序能够相互调用和通信。
2. 远程过程调用(RPC)SOAP 可以用作远程过程调用的协议。
Java RPC通信机制之XML-RPC
Java RPC通信机制之XML-RPC二、举例下面举一个实际运用XML-RPC进行RPC调用的例子,XML-RPC规范有多种针对不同语言的实现,这里我们使用的是Apache的XML-RPC3.0RC1。
在开始之前,需到/commons/index.html下载如下程序包:commons-codec-1.3(通用编码/解码算法实现,可参考/Java/Article/29795/1954?pf=true或/commons/codec/userguide.html来获得该软件包的详细信息)commons-httpclient-3.0.1(HTTP协议的客户端编程工具包,详细介绍见/developerworks/cn/opensource/os-httpclient/)将上述通用工具包解压后,拷贝其中的jar文件到XML-RPC解压目录的dist目录中。
并添加如下环境变量:XMLRPC_HOME XML-RPC的解压目录XMLRPC_LIB %XMLRPC_HOME%/distXMLRPCCLASSPATH %XMLRPC_LIB%/xmlrpc-common-3.0rc1.jar;%XMLRPC_LIB %/xmlrpc-server-3.0rc1.jar;%XMLRPC_LIB%/xmlrpc-client-3.0rc1.jar;%XMLRPC_LIB%/com mons-httpclient-3.0.1.jar;%XMLRPC_LIB%/commons-codec-1.3.jar整个应用很简单,通过XML-RPC调用Server端提供的HelloHandler.sayHello方法回显一个字符串信息。
下面是HelloHandler接口及其实现类相关代码:// HelloHandler.javapackage demo.xmlrpc;public interface HelloHandler {public String sayHello(String str);}// HelloHandlerImpl.javapackage demo.xmlrpc;public class HelloHandlerImpl implements HelloHandler {public String sayHello(String str){return "Hello, " + str + "!";}}以下是对应的Server端源代码:// Server1.javapackage demo.xmlrpc;import java.io.IOException;import java.io.OutputStream;import javax.servlet.ServletConfig;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import org.apache.xmlrpc.XmlRpcException;import org.apache.xmlrpc.server.PropertyHandlerMapping;import org.apache.xmlrpc.server.XmlRpcServerConfigImpl;import org.apache.xmlrpc.webserver.XmlRpcServletServer;public class Server1 extends HttpServlet {private XmlRpcServletServer server;public void init(ServletConfig pConfig) throws ServletException {super.init(pConfig);try {// create a new XmlRpcServletServer objectserver = new XmlRpcServletServer();// set up handler mapping of XmlRpcServletServer objectPropertyHandlerMapping phm = new PropertyHandlerMapping();phm.addHandler("HelloHandler", HelloHandlerImpl.class);server.setHandlerMapping(phm);// more config of XmlRpcServletServer objectXmlRpcServerConfigImpl serverConfig = (XmlRpcServerConfigImpl)server.getConfig();serverConfig.setEnabledForExtensions(true);serverConfig.setContentLengthOptional(false);} catch (XmlRpcException e) {try {log("Failed to create XmlRpcServer: " + e.getMessage(), e);} catch (Throwable ignore) {}throw new ServletException(e);}}public void doPost(HttpServletRequest pRequest, HttpServletResponse pResponse) throws IOException, ServletException {server.execute(pRequest, pResponse);}}以下是对应的Client端源代码:// Client1.javapackage demo.xmlrpc;import java.io.IOException;import .MalformedURLException;import java.util.Vector;import .URL;import org.apache.xmlrpc.XmlRpcException;import org.apache.xmlrpc.client.XmlRpcClient;import org.apache.xmlrpc.client.XmlRpcClientConfigImpl;public class Client1 {public static void main(String[] args) {try {// config clientXmlRpcClientConfigImpl config = new XmlRpcClientConfigImpl();config.setServerURL(newURL("http://localhost:8080/jsp/XmlRpcServer")); // should be modified according to your configuration of jsp container// create a new XmlRpcClient object and bind above config object with itXmlRpcClient client = new XmlRpcClient();client.setConfig(config);// create parameter listVector<String> params = new Vector<String>();params.addElement("Tom");// execute XML-RPC callString result = (String) client.execute("HelloHandler.sayHello", params);System.out.println(result);} catch (MalformedURLException e) {System.out.println(e.toString());} catch (XmlRpcException e) {System.out.println(e.toString());} catch (IOException e) {e.printStackTrace();}}}程序源码中已包含了详细的注释,这里就不作过多解释了。
