rmi和jndi基础
文章目录
前言
RMI:远程方法调用(Remote Method Invocation),它支持存储在不同地址空间的程序级对象之间彼此进行通信,实现远程对象之间的无缝远程调用。
JNDI:Java命名和目录接口Java Naming and Directory Interface,作用是为JAVA应用程序提供命名和目录访问服务的API
提示:以下是本篇文章正文内容,下面案例可供参考
一、RMI
官方文档:https://docs.oracle.com/javase/tutorial/rmi/overview.html
下图描述了一个RMI分布式应用程序,该应用程序使用RMI注册表来获取对远程对象的引用。服务器调用注册表将名称与远程对象相关联(或绑定)。客户端在服务器注册表中按名称查找远程对象,然后调用该对象上的方法。该图还显示,RMI系统使用现有的web服务器在需要时从服务器到客户端和从客户端到服务器加载对象的类定义。
1.定义一个接口继承remote(必须抛出RemoteException异常)
代码如下(示例):
package com.star.rmiDemo;
import java.rmi.Remote;
import java.rmi.RemoteException;
public interface testRmi extends Remote {
public String World(String test) throws RemoteException;
}
2.服务端创建接口实现类
代码如下(示例):
package com.star.rmiDemo;
import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;
public class testRmiImpl extends UnicastRemoteObject implements testRmi {
protected testRmiImpl() throws RemoteException {
super();
}
@Override
public String World(String test) throws RemoteException {
String s = test.toUpperCase();
System.out.println(s);
return s;
}
}
3.服务端
package com.star.rmiDemo;
import java.rmi.AlreadyBoundException;
import java.rmi.RemoteException;
import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;
/**
* 编号7089
*/
public class rmiServer {
public static void main(String[] args) throws RemoteException, AlreadyBoundException {
System.out.println("远程方法创建等待调用ing......");
//创建远程对象
testRmiImpl testRmi = new testRmiImpl();
// //创建注册表
Registry registry = LocateRegistry.createRegistry(1099);
// //将远程对象注册到注册表里面,并且取名为test
registry.rebind("test",testRmi);
}
}
4.客户端
package com.star.rmiDemo1;
import com.star.rmiDemo.SayHello;
import com.star.rmiDemo.testRmi;
import java.rmi.NotBoundException;
import java.rmi.Remote;
import java.rmi.RemoteException;
import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;
/**
* 编号7089
*/
public class rmiClient {
public static void main(String[] args) throws RemoteException, NotBoundException {
//获取到注册中心的代理
Registry registry = LocateRegistry.getRegistry("localhost", 1099);
// //利用注册中心的代理去查询远程注册表中名为test的对象
testRmi rmi = (testRmi)registry.lookup("test");
// //调用远程方法
rmi.World("hello world");
}
}
二、JNDI操作rmi
官方文档:https://docs.oracle.com/javase/tutorial/jndi/overview/index.html
JNDI体系结构由一个API和一个服务提供者接口(SPI)组成。Java应用程序使用JNDI API来访问各种命名和目录服务。SPI允许透明地插入各种命名和目录服务,从而允许Java应用程序使用JNDI API访问它们的服务。如下图所示:
JNDI可以访问的目录及服务,比如:DNS、LDAP、CORBA对象服务、RMI等等。
简单理解:在前面的RMI,比如RMI对外提供了服务,那么JNDI可以通过
相关API可以链接处理这些服务。
1、jndi客户端
package com.star.jndi;
import com.star.rmiDemo.SayHello;
import com.star.rmiDemo.testRmi;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import java.rmi.RemoteException;
public class JndiClient {
public static void main(String[] args) throws NamingException, RemoteException {
InitialContext initialContext = new InitialContext();
//检索名称对象
testRmi lookup = (testRmi) initialContext.lookup("rmi://127.0.0.1/test");
System.out.println(lookup.World("hello China"));
}
}
2、jndi服务端
package com.star.jndi;
import com.star.rmiDemo.SayHelloImpl;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import java.rmi.RemoteException;
public class JndiServer {
public static void main(String[] args) throws NamingException, RemoteException {
//构建一个初始上下文
InitialContext initialContext = new InitialContext();
//将名称绑定到对象,覆盖任何现有绑定
initialContext.rebind("rmi://127.0.0.1:1099/test",new testRmiImpl());
System.out.println("JNDI启动成功!!!");
}
}
3、运行结果
先运行RMI服务端,在运行jndi服务端,在运行jndi客户端