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中用。