rmi也可以实现webservice的功能。
定义一个接口,必须继承remote
import java.rmi.Remote; import java.rmi.remoteexception; public interface IRmi extends Remote { public String test() throws remoteexception; public String testName(String name) throws remoteexception; }
实现这个接口:继承unicastremoteonject.
import java.rmi.remoteexception; import java.rmi.server.UnicastRemoteObject; public class RmiImpl extends UnicastRemoteObject implements IRmi { /** */ private static final long serialVersionUID = 1L; protected RmiImpl() throws remoteexception { super(); } @Override public String test() throws remoteexception { return "rmi"; } @Override public String testName(String name) throws remoteexception { return name; } }
-
rmi的服务类。如下
-
public class UnicastRemoteObject
- extends RemoteServer
Used for exporting a remote object with JRMP and obtaining a stub that communicates to the remote object.
For the constructors and static exportObject
methods below,the stub for a remote object being exported is obtained as follows:
- If the remote object is exported using the
UnicastRemoteObject.exportObject(Remote)
method,a stub class (typically pregenerated from the remote object's class using thermic
tool) is loaded and an instance of that stub class is constructed as follows.- A "root class" is determined as follows: if the remote object's class directly implements an interface that extends
Remote
,then the remote object's class is the root class; otherwise,the root class is the most derived superclass of the remote object's class that directly implements an interface that extendsRemote
. - The name of the stub class to load is determined by concatenating the binary name of the root class with the suffix
"_Stub"
. - The stub class is loaded by name using the class loader of the root class. The stub class must extend
RemoteStub
and must have a public constructor that has one parameter,of typeRemoteRef
. - Finally,an instance of the stub class is constructed with a
RemoteRef
.
- A "root class" is determined as follows: if the remote object's class directly implements an interface that extends
- If the appropriate stub class Could not be found,or the stub class Could not be loaded,or a problem occurs creating the stub instance,a
StubNotFoundException
is thrown. - For all other means of exporting:
- If the remote object's stub class (as defined above) Could not be loaded or the system property
java.rmi.server.ignoreStubClasses
is set to"true"
(case insensitive),aProxy
instance is constructed with the following properties:- The proxy's class is defined by the class loader of the remote object's class.
- The proxy implements all the remote interfaces implemented by the remote object's class.
- The proxy's invocation handler is a
RemoteObjectInvocationHandler
instance constructed with aRemoteRef
. - If the proxy Could not be created,a
StubNotFoundException
will be thrown.
- Otherwise,an instance of the remote object's stub class (as described above) is used as the stub.
- If the remote object's stub class (as defined above) Could not be loaded or the system property
启动一个rmi服务器:
import java.net.MalformedURLException; import java.rmi.AlreadyBoundException; import java.rmi.Naming; import java.rmi.remoteexception; import java.rmi.registry.LocateRegistry; public class RmiServer { public static void main(String[] args) { IRmi ir = null; try { ir = new RmiImpl(); } catch (remoteexception e) { e.printstacktrace(); } try { LocateRegistry.createRegistry(8888); Naming.bind("rmi://localhost:8888/IRmi123",ir); } catch (remoteexception e) { e.printstacktrace(); } catch (MalformedURLException e) { e.printstacktrace(); } catch (AlreadyBoundException e) { e.printstacktrace(); } } }
LocateRegistry.createRegistry(8888);//注册服务,绑定端口
Naming.bind("rmi://localhost:8888/IRmi123",ir);//给接口绑定服务,绑定的是接口哦。
下面写一个rmi客户端:
import java.net.MalformedURLException; import java.rmi.Naming; import java.rmi.NotBoundException; import java.rmi.remoteexception; public class RmiClient { public static void main(String[] args) { try { IRmi ir = (IRmi) Naming.lookup("rmi://localhost:8888/IRmi123"); System.out.println(ir.test()); System.out.println(ir.testName("rmi啊")); } catch (MalformedURLException e) { // Todo Auto-generated catch block e.printstacktrace(); } catch (remoteexception e) { // Todo Auto-generated catch block e.printstacktrace(); } catch (NotBoundException e) { // Todo Auto-generated catch block e.printstacktrace(); } } }
lookup是根据url服务区找对应的接口。记住,你绑定的是什么就找什么。
rmi实现webservice比较麻烦,因为它依赖的接口太多,很死,且只能在java中用。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。