加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

webservice之rmi

发布时间:2020-12-16 23:53:46 所属栏目:安全 来源:网络整理
导读: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) throw

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读