webservice之rmi

来源:互联网 发布:淘宝太坑图片 编辑:程序博客网 时间:2024/05/21 09:54

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();}@Overridepublic String test() throws RemoteException {return "rmi";}@Overridepublic 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 extendsRemote, 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 extendRemoteStub and must have a public constructor that has one parameter, of typeRemoteRef.
    • Finally, an instance of the stub class is constructed with a RemoteRef.
  • 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, aStubNotFoundException 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 propertyjava.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 a RemoteRef.
      • 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.


启动一个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 blocke.printStackTrace();} catch (RemoteException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (NotBoundException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}

lookup是根据url服务区找对应的接口。记住,你绑定的是什么就找什么。


rmi实现webservice比较麻烦,因为它依赖的接口太多,很死,且只能在java中用。

0 0
原创粉丝点击