webservice之rmi

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 the rmic 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 extends Remote.
    • 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 type RemoteRef.
    • 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, 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), a Proxy 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 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中用。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值