java远程通讯技术及简单实现
在分布式服务框架中,一个最基础的问题就是远程服务是怎么通讯的,在Java底层领域中有很多可实现远程通讯的技术,例如:RMI、MINA、ESB、Burlap、SOAP、EJB和JMS等,在j2ee中,对java底层远程通讯的技术进行了封装,形成了 Hessian 、 HttpInvoker 、 XFire 、Axis 等多种形式的远程调用技术。但对高级程序员而言仍需要掌握Java底层领域中远程通讯的
1.远程服务基本原理
1)底层协议
要实现网络机器间的通讯,首先得来看看计算机系统网络通信的基本原理,在底层层面去看,网络通信需要做的就是将流从一台计算机传输到另外一台计算机,基于传输协议和网络IO来实现,其中传输协议比较出名的有http、tcp、udp等等,http、tcp、udp都是在基于Socket概念上为某类应用场景而扩展出的传输协议,网络IO,主要有bio、nio、aio三种方式,所有的分布式应用通讯都基于这个原理而实现,只是为了
应用的易用,各种语言通常都会提供一些更为贴近应用易用的应用层协议。
2)应用级协议
远程服务通讯,需要达到的目标是在一台计算机发起请求,另外一台机器在接收到请求后进行相应的处理并将结果返回给请求端,这其中又会有诸如onewayrequest、同步请求、异步请求等等请求方式,按照网络通信原理,需要实现这个需要做的就是将请求转换成流,通过传输协议传输至远端,远端计算机在接收到请求的流后进行处理,处理完毕后将结果转化为流,并通过传输协议返回给调用端。
2.RMI
2.1RMI原理
RMI是个典型的为java定制的远程通信协议,RMI全部的宗旨就是尽可能简化远程接口对象的使用。
来看下基于RMI的一次完整的远程通信过程的原理:
1)客户端发起请求,请求转交至RMI客户端的stub类;
2)stub类将请求的接口、方法、参数等信息进行序列化;
3)基于socket将序列化后的流传输至服务器端;
4)服务器端接收到流后转发至相应的skelton类;
5)skelton类将请求的信息反序列化后调用实际的处理类;
6)处理类处理完毕后将结果返回给skelton类;
7)Skelton类将结果序列化,通过socket将流传送给客户端的stub;
8)stub在接收到流后反序列化,将反序列化后的Java Object返回给调用者。
2.2JAVA对RMI的支持
,则该异常将指示给调用方.
2.3rmi在java中的应用
它。
1)远程对象的本地接口
package test.rmi;
import java.rmi.Remote;
import java.rmi.RemoteException;
public interface HelloRMI extends Remote{
}
2)远程对象实现
package test.rmi;
importjava.rmi.RemoteException;
importjava.rmi.server.UnicastRemoteObject;
public class HelloRMIImpl extends UnicastRemoteObject implementsHelloRMI {
}
3)RMI服务器
package test.rmi;
importjava.net.MalformedURLException;
importjava.rmi.AlreadyBoundException;
import java.rmi.Naming;
importjava.rmi.RemoteException;
importjava.rmi.registry.LocateRegistry;
public class HelloRMIServer{
步,缺少注册表创建,则无法绑定对象到远程注册表上
}
4)RMI客户机
package test.rmi;
importjava.net.MalformedURLException;
import java.rmi.Naming;
importjava.rmi.NotBoundException;
importjava.rmi.RemoteException;
public class HelloRMIClient{
}
依赖这个IP和端口。
3.XML-RPC
3.1原理
1)接口实现
public class HelloHandler implements ServicesHandler {
}
2)远程调用
package test.xmlrpc;
import java.io.IOException;
import java.net.MalformedURLException;
import java.util.Vector;
import java.net.URL;
import org.apache.xmlrpc.XmlRpcException;
import org.apache.xmlrpc.client.XmlRpcClient;
import org.apache.xmlrpc.client.XmlRpcClientConfigImpl;
public class TestClient {
to your configuration of jsp container
}
3)建立一个web服务器
package test.xmlrpc;
import javax.servlet.*;
import javax.servlet.http.*;
import java.io.*;
import org.apache.xmlrpc.*;
import org.apache.xmlrpc.server.*;
import org.apache.xmlrpc.webserver.*;
public class XmlRpcServicesServlet extends HttpServlet {
}
在web.xml中的配置
<servlet>
3.2RMI和RPC的区别
XML-RPC也是一种和RMI类似的远程调用的协议,它和RMI的不同之处在于它以标准的xml格式来定义请求的信息(请求的对象、方法、参数等).所以,在RMI和RPC之间最主要的区别在于方法是如何别调用的。
3.3xml-rpc的缺点
1)XML-RPC的消息系统过于简单,没有完整意义上的消息模型
2)XML-RPC调用服务的方式要求直接指定对象和方法,称不上完整的面向服务的体系
3)XML-RPC服务器端提供的服务实际上是特定对象的某个方法,限制了服务器端的开发
4.Binary-RPC
Binary-RPC看名字就知道和XML-RPC是差不多的了,不同之处仅在于传输的标准格式由XML转为了二进制的格式。
1)写一个接口:
package test.hassian;
public interface SayHello{
}
2)编写一个实现:
package test.hassian;
importcom.caucho.hessian.server.HessianServlet;
public class SayHelloImpl extends HessianServlet implementsSayHello {
}
3)bean类
package test.hassian;
importjava.io.Serializable;
}
4)远程调用类
package test.hassian;
importjava.net.MalformedURLException;
importcom.caucho.hessian.client.HessianProxyFactory;
public class HessianClientTest{
服务器端的配置
在web.xml中,加入下面两段代码: