`
lanhuidong
  • 浏览: 227274 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

Java远程方法调用(RMI)

    博客分类:
  • Java
阅读更多

Java远程方法调用(Java Remote Method Invocation, RMI)支持一个JVM中的对象调用另一个JVM对象的方法,而这两个JVM可以分布在不同的主机上,为Java的分布式应用提供了支持。

 

1.首先,定义一个远程调用接口,该接口必须实现java.rmi.Remote接口,接口的方法声明要抛出java.rmi.RemoteException

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

public interface HelloRemote extends Remote {

    String sayHello(UserRemote user)throws RemoteException;

}

 

 

import java.io.Serializable;

public class User implements Serializable {

    private static final long serialVersionUID = 3553604278956856032L;

    private String name;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

}

 2.实现接口并继承UnicastRemoteObject

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

public class HelloRemoteImpl extends UnicastRemoteObject implements HelloRemote {

    private static final long serialVersionUID = -6209023821784985143L;
    
    protected HelloRemoteImpl() throws RemoteException {
        super();
    }

    @Override
    public String sayHello(User user) throws RemoteException {
        return "Hello, " + user.getName();
    }

}

 3.注册该服务并启动

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

public class RemoteServer {

    public static void main(String[] args) {
        try {
//            System.setProperty("java.rmi.server.hostname", "10.0.0.249");
            LocateRegistry.createRegistry(5590);
            HelloRemoteImpl server = new HelloRemoteImpl();
            Naming.rebind("//10.0.0.249:5590/HelloRemote", server);
            System.out.println("server start……");
        } catch (RemoteException e) {
            e.printStackTrace();
        } catch (MalformedURLException e) {
            e.printStackTrace();
        }
    }

}

 

5.调用RMI服务

package com.lanhuidong.client;

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) {
        String url = "//10.0.0.249:5590/HelloRemote";
        try {
            HelloRemote helloRemote = (HelloRemote) Naming.lookup(url);
            User user = new User();
            user.setName("RMI");
            System.out.println(helloRemote.sayHello(user));
        } catch (MalformedURLException e) {
            e.printStackTrace();
        } catch (RemoteException e) {
            e.printStackTrace();
        } catch (NotBoundException e) {
            e.printStackTrace();
        }

    }
}

 

 

在实际项目中,可能项目使用了Spring等框架,下面是spring的rmi服务

1定义接口(不用继承任何其它接口)

public interface UserRmiService {
    public String sayHello(User user);
}

 

import java.io.Serializable;

public class User implements Serializable{

    private static final long serialVersionUID = 8550373205815267923L;
    private String userName;

    public String getUserName() {
        return userName;
    }

    public void setUserName(String userName) {
        this.userName = userName;
    }

}

 2.实现该接口

public class UserRmiServiceImpl implements UserRmiService {

	@Override
	public String sayHello(User user) {
		return "Hello, " + user.getUserName();
	}

}

 

3.在applicationContext.xml中配置

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="
http://www.springframework.org/schema/beans 
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">

	<bean id="userRmiServiceImpl" class="com.darcy.rmi.service.impl.UserRmiServiceImpl"/>
	<bean id="userRmi" class="org.springframework.remoting.rmi.RmiServiceExporter">
		<property name="service" ref="userRmiServiceImpl" />
		<property name="serviceName" value="userRmi" />
		<property name="serviceInterface" value="com.darcy.rmi.service.UserRmiService" />
		<property name="registryPort" value="9999" />
	</bean>
</beans>

 4.启动服务

import org.springframework.context.support.ClassPathXmlApplicationContext;

public class ServerTest {

	public static void main(String[] args) {
                               System.setProperty("java.rmi.hostname", "10.0.0.249"); 
		new ClassPathXmlApplicationContext("applicationContext-Server.xml");
		System.out.println("server start......");
	}
}

 

5.调用服务

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class ClientTest {

    public static void main(String[] args) {
        ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext-client.xml");
        UserRmiService ums = (UserRmiService) ctx.getBean("rmiProxy");
        User user = new User();
        user.setUserName("RMI");
        System.out.println(ums.sayHello(user));
    }
}

  applicationContext-client.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="
http://www.springframework.org/schema/beans 
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">

    <bean id="rmiProxy" class="org.springframework.remoting.rmi.RmiProxyFactoryBean">
        <property name="serviceUrl" value="rmi://127.0.0.1:9999/userRmi"/>
        <property name="ServiceInterface" value="com.darcy.rmi.service.UserRmiService" />
    </bean>
</beans>

 

分享到:
评论

相关推荐

    三种方式实现java远程调用(rmi),绝对可用

    在提供的压缩包文件中,"三种方式(原始方式_spring_jndi)实现java远程调用(rmi)"包含了相关的示例代码,帮助开发者理解并实践这三种RMI实现方法。在MyEclipse或其他Java开发环境中导入这些代码,可以进行调试和...

    Java-远程方法调用RMI参数详解.docx

    Java 远程方法调用(Remote Method Invocation,RMI)是一种在分布式环境中调用对象方法的技术,它使得Java应用程序能够透明地调用运行在不同 JVM 上的远程对象的方法。RMI 包含了一系列的参数,这些参数对于优化...

    java 远程方法调用(java rmi)

    Java 远程方法调用(Java RMI,Remote Method Invocation)是Java平台提供的一种用于构建分布式应用程序的技术。它允许一个对象在某个Java虚拟机(JVM)上执行的方法调用另一个在不同JVM上的对象的方法,仿佛它们是...

    java远程方法调用

    ### Java远程方法调用(RMI):深入解析与实践 #### 一、RMI概念与原理 Java远程方法调用(Remote Method Invocation,简称RMI)是Java平台提供的一种分布式计算模型,允许一个Java虚拟机(JVM)上的对象通过网络...

    java rmi远程方法调用 客户端

    Java RMI(Remote Method Invocation,远程方法调用)是Java平台提供的一种分布式计算技术,它允许在不同的Java虚拟机之间透明地调用对象的方法。在RMI架构中,客户端能够像调用本地对象一样调用远程服务器上的对象...

    Java RMI 远程方法调用

    Java RMI(Remote Method Invocation,远程方法调用)是Java平台提供的一种分布式计算技术,它允许在不同的Java虚拟机之间进行方法调用,仿佛这些方法是在本地对象上执行一样。这个技术极大地简化了构建分布式应用的...

    Java RMI远程方法调用详解-例子代码

    首先,我们需要定义一个实现了`java.rmi.Remote`接口的类,比如`MyRemoteInterface.java`,并在这个接口中声明所有需要远程调用的方法。这些方法必须抛出`java.rmi.RemoteException`,因为网络通信可能会出现异常。...

    Java远程方法调用(RMI)

    Eclipse 插件RMI Plug-in for Eclipse 2.0 博文链接:https://robinjie.iteye.com/blog/34606

    java远程调用rmi实例

    在Windows环境下,同样需要JRE,运行客户端程序来执行远程调用。 注意,RMI的安全性、异常处理和网络通信细节也是开发者需要考虑的问题。例如,需要处理可能的`RemoteException`,以及配置JVM的安全策略文件以允许...

    rmi java 远程方法调用

    2. **类型安全**:由于使用Java语言,RMI提供了类型安全的远程调用。 3. **高性能**:RMI可以利用Java的自动内存管理和垃圾收集机制,减少资源消耗。 ### RMI的劣势 1. **平台依赖**:虽然Java有“一次编写,到处...

    Java RMI(远程方法调用)Demo

    1. **创建远程接口**:定义一个继承自Remote的接口,声明需要远程调用的方法。 2. **实现远程接口**:编写一个类实现这个接口,提供具体的方法实现。 3. **注册远程对象**:在服务器端创建远程对象实例,然后将其...

    JAVA远程调用RMI与应用

    JAVA远程调用RMI与应用 一、RMI(Remote Method Invocation)概念解析 RMI,即远程方法调用,是Java平台提供的分布式计算模型,它允许Java对象跨网络进行方法调用,如同本地调用一样。RMI的实现基于Java的面向对象...

    JAVA RMI远程调用方法代码

    接下来,`getMemberAccountCount`方法实现了远程调用逻辑,通过`this.ref.invoke`方法调用了远程方法,并处理了可能抛出的异常。 #### 2. 客户端代码分析 客户端通过`Naming.lookup`方法获取远程服务的引用,然后...

    RMI远程方法调用RMI远程方法调用

    1. **远程接口**:定义了可以被远程调用的方法,这个接口需要继承自`java.rmi.Remote`。 2. **远程实现**:实现了远程接口的具体逻辑,它通常包含实际业务功能的代码。 3. **Stub**:客户端调用的代理对象,它负责将...

    自己的Java远程方法调用组件

    Java远程方法调用(Remote Method Invocation,简称RMI)组件是一种关键的技术,它允许Java应用程序在不同的网络节点之间透明地调用对象的方法,仿佛这些对象都在本地进程中一样。这种技术在构建分布式系统、大型...

    java rmi 远程方法调用 服务端

    1. 远程接口(Remote Interface):定义了可以被远程调用的方法,这些方法必须声明抛出`java.rmi.RemoteException`。接口需要使用`@Remote`注解标记。 2. 远程实现类(Remote Implementation):实现了远程接口,并...

Global site tag (gtag.js) - Google Analytics