rmi和jndi基础

本文介绍了RMI和JNDI的基础知识。RMI是Java中的远程方法调用技术,允许不同地址空间的对象间通信。JNDI则提供命名和目录服务的API。文中通过示例展示了如何定义RMI接口,创建服务端和客户端,以及如何使用JNDI进行RMI操作。文章还提到了JNDI的架构,包括其API和服务提供者接口,以及JNDI如何访问各种服务。
摘要由CSDN通过智能技术生成

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客户端
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值