分布式相关 ----jndi和rmi

JNDI
一、 基本概念: rmi技术产生后,使远程对象的查找成为了技术焦点。JNDI技术产生后,就可方便的查找远程或者本地对象

  1. JNDI是什么: The Java Naming and Directory Interface,java命名和目录接口,是一组在java应用中访问命名和目录服务的API。为开发人员提供了查找和访问各种命名和目录服务的通用、统一的方式。借助于JNDI接口,能够通过名字定位用户、机器、网络、对象服务等
    a. 命名服务: 就像DNS一样,通过命名服务器提供服务,大部分的J2EE服务器都含有命名服务器
    b. 目录服务: 一种简化的RDBMS系统,通过目录具有的属性保存一些简单的信息

  2. JNDI的好处:
    a. 包含大量命名和目录服务,可以使用相同的api调用访问任何命名或目录服务
    b. 可以同时连接多个命名和目录服务
    c. 允许把名称同java对象或资源关联起来,不必知道对象或资源的物理ID
    d. 使用通用接口访问不同种类的目录服务
    e. 使得开发人员能够集中使用和实现一种类型的命名或目录服务客户api上

二、 JNDI应用程序结构: JNDI结构由一个API和一个SPI组成

  1. JNDI上下文: javax.naming.Context。 命名服务是将名称与对象相关联,这种关联被称为绑定,一组这样的绑定称为上下文
  2. 初始化上下文: InitialContext是一个实现了Context接口的类。使用这个类作为命名服务的入口点
  3. 要通过JNDI进行资源访问时,必须设置初始化上下文的参数。主要是设置JNDI驱动的类型(java.naming.factory.initial)和提供命名服务的url(java.naming.provider.url)。因为JNDI的实现产品有很多,所以驱动的类名因提供JNDI服务器的不同而不同。url值包括提供命名服务的主机地址和端口号。
    这里写图片描述

Rmi简单例子
1、 项目结构
这里写图片描述
2、 代码
注: 如果接口返回的数据类型是对象的话,则需要进行手动序列化 implements serializable

// com.distribute.RmiSample
package com.distribute;

import java.rmi.Remote;
import java.rmi.RemoteException;

public interface RmiSample extends Remote{
    public int sum(int a, int b) throws RemoteException;
}
// com.distribute.RmiSampleImpl
package com.distribute;

import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;

public class RmiSampleImpl extends UnicastRemoteObject implements RmiSample {

    /**
     * 
     */
    private static final long serialVersionUID = 1L;

    public RmiSampleImpl() throws RemoteException {
        super();
    }

    @Override
    public int sum(int a, int b) throws RemoteException {
        return a + b;
    }
}
// com.distribute.RmiSampleClient
package com.distribute;

import java.net.MalformedURLException;
import java.rmi.Naming;
import java.rmi.NotBoundException;
import java.rmi.RemoteException;

public class RmiSampleClient {
    public RmiSampleClient() throws MalformedURLException, RemoteException, NotBoundException {
        String url = "//localhost:8808/sample";
        RmiSample rmiObject = (RmiSample) Naming.lookup(url);
        System.out.println("1 + 2 =" + rmiObject.sum(1, 2));
    }
}

//com.distribute.RmiServer
package com.distribute;

import java.net.MalformedURLException;
import java.rmi.Naming;
import java.rmi.RMISecurityManager;
import java.rmi.RemoteException;
import java.rmi.registry.LocateRegistry;

public class RmiServer {
    public RmiServer() {
        // 创建和安装一个安全管理器,令其支持RMI。作为Java开发包的一部分,适用于RMi唯一一个是RMISecurityManager
//      if (System.getSecurityManager() == null) {
//          System.setSecurityManager(new RMISecurityManager());
//      }

        try {
            LocateRegistry.createRegistry(8808);
            RmiSampleImpl server = new RmiSampleImpl();
            Naming.rebind("//localhost:8808/sample", server);
            System.out.println("Server is staring...");
        } catch (RemoteException | MalformedURLException e) {
            e.printStackTrace();
        }
    }
}

// com.distribute.jndi.RmiSampleClientJndi
package com.distribute.jndi;

import java.rmi.RemoteException;

import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;

import com.distribute.RmiSample;

public class RmiSampleClientJndi {
    public RmiSampleClientJndi() {
        try {
            System.setProperty(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.rmi.registry.RegistryContextFactory");
            System.setProperty(Context.PROVIDER_URL, "rmi://localhost:8808");
            InitialContext context = new InitialContext();
            RmiSample rmiObject = (RmiSample) context.lookup("java:com/distribute/RmiSampleImpl");
            System.out.println("1 + 2 = " + rmiObject.sum(1, 2));
            context.close();
        } catch (RemoteException | NamingException e) {
            e.printStackTrace();
        }
    }
}
//com.distribute.jndi.RmiSampleServerJndi
package com.distribute.jndi;

import java.rmi.RemoteException;
import java.rmi.registry.LocateRegistry;

import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;

import com.distribute.RmiSampleImpl;

public class RmiSampleServerJndi {
    public static void main(String[] args) {
        try {
            LocateRegistry.createRegistry(8808);
            RmiSampleImpl server = new RmiSampleImpl();
            System.setProperty(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.rmi.registry.RegistryContextFactory");
            System.setProperty(Context.PROVIDER_URL, "rmi://localhost:8808");
            InitialContext context = new InitialContext();
            context.bind("java:com/distribute/RmiSampleImpl", server);
            context.close();
            System.out.println("Server is starting...");
        } catch (RemoteException | NamingException e) {
            e.printStackTrace();
        }
    }
}

猜你喜欢

转载自blog.csdn.net/miracle_8/article/details/79274110
今日推荐