`
Vikings825
  • 浏览: 66065 次
  • 性别: Icon_minigender_1
  • 来自: 威海
文章分类
社区版块
存档分类
最新评论

Java RMI 远程调用

阅读更多
今天看一天的RMI终于搞懂了,到底是怎么回事了。

RMI网上有很多说明,大概就是这样的。
  1、  编写并且编译接口的Java代码
  2、  编写并且编译接口实现的Java代码
  3、  从接口实现类中生成 Stub 和 Skeleton 类文件
  4、  编写远程服务的主运行程序
  5、  编写RMI的客户端程序
  6、  安装并且运行RMI系统

先讲一种网上最常见的(参考资料来源Java RMI Tutorial)
首先编写服务断对外提供的接口,必须继承 java.rmi.Remote。
接口代码如下:
import java.rmi.*;
/**
 * Remote Interface for the "Hello, world!" example.
 */
public interface HelloInterface extends Remote {
  /**
   * Remotely invocable method.
   * @return the message of the remote object, such as "Hello, world!".
   * @exception RemoteException if the remote invocation fails.
   */
  public String say() throws RemoteException;
}


再来就是对该接口的实现,这里有两种方式(一种是必须实现该接口,必继承java.rmi.server.UnicastRemoteObject,另一种是只实现该接口,但是必须调用UnicastRemoteObject.exportObject方法),采用第一种代码如下:
import java.rmi.*;
import java.rmi.server.*;
/**
 * Remote Class for the "Hello, world!" example.
 */
public class Hello extends UnicastRemoteObject implements HelloInterface {
  private String message;
  /**
   * Construct a remote object
   * @param msg the message of the remote object, such as "Hello, world!".
   * @exception RemoteException if the object handle cannot be constructed.
   */
  public Hello (String msg) throws RemoteException {
    message = msg;
  }
  /**
   * Implementation of the remotely invocable method.
   * @return the message of the remote object, such as "Hello, world!".
   * @exception RemoteException if the remote invocation fails.
   */
  public String say() throws RemoteException {
    return message;
  }
}

分别编译文件。

编译完成后,要从接口实现类中生成 Stub 和 Skeleton 类文件,这时就要用到
rmic Hello
命令,如果出现错误,请讲Hello.class的路径设置到classpath路径下。

然后编写客户器端代码:
  /**
   * Client program for the "Hello, world!" example.
   * @param argv The command line arguments which are ignored.
   */
  public static void main (String[] argv) {
    try {
      HelloInterface hello = 
        (HelloInterface) Naming.lookup ("//172.0.0.1/Hello");
      System.out.println (hello.say());
    } catch (Exception e) {
      System.out.println ("HelloClient exception: " + e);
    }
  }

然后编译。

然后编写服务端代码,
  /**
   * Server program for the "Hello, world!" example.
   * @param argv The command line arguments which are ignored.
   */
  public static void main (String[] argv) {
    try {
      Naming.rebind ("Hello", new Hello ("Hello, world!"));
      System.out.println ("Hello Server is ready.");
    } catch (Exception e) {
      System.out.println ("Hello Server failed: " + e);
    }
  }

然后编译,

开始启动服务器,这里是最麻烦的,
首先开启RMI Registry(注册表),
输入命令行:rmiregistry &
完成后放在一边保持不动,重新开启一个终端。
然后运行:
java HelloServer &
完成后放在一边保持不动,再重新开启一个终端。
最后再
java HelloClient。
终于成功显示。

这样太麻烦了,还容易出错,有没有简单方法呢?
有下面 我就来介绍介绍:
前面还是一样的,我重新写了代码:如下
import java.rmi.Remote;
import java.rmi.RemoteException;

public interface TestInterfactRemote extends Remote {
	 
	 public String echo(String message) throws RemoteException; 
}

import java.rmi.RemoteException;

public class TestInterfaceRemoteImpl implements TestInterfactRemote {

			public String echo(String message) throws RemoteException {
				if("quit".equalsIgnoreCase(message.toString())){
					System.out.println("Server will be shutdown");
					System.exit(0);
				}
				System.out.println("Message from client:"+ message);
				return "server response" + message;
			} 
}


不同的地方在于服务端和客户端,仔细看:
public class Server {
	     public Server() {  
		        try {
		        	int port = 9527;
		        	String name = "testDemo";
		            TestInterfactRemote testInterfactRemote = new TestInterfaceRemoteImpl();
		            //完成对象的绑定
		            UnicastRemoteObject.exportObject(testInterfactRemote, port);
		            //完成注册表的开启
		            Registry registry = LocateRegistry.createRegistry(1099);
		            //这里没有用Naming绑定,运用的是registry提供的绑定方法
		            registry.rebind(name, testInterfactRemote);
		        } catch (Exception e) {  
		            e.printStackTrace();  
		       }  
		    }  
		   
		     public static void main(String args[]) {  
		         new Server();  
		     }  
}

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;

import test.TestInterfactRemote;

 public class Client {  
	     public static void main(String args[]) {  
	         try {
	        	 //获得登记注册表的位置
	        	 Registry registry = LocateRegistry.getRegistry("localhost");
	        	 String name = "testDemo";
	        	 //运用注册表进行对象的查找
	             TestInterfactRemote testInterfactRemote = (TestInterfactRemote) registry.lookup(name);
	             BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
	             String input = br.readLine();
	             String reponse = testInterfactRemote.echo(input);
	             System.out.println(reponse);
	         } catch (Exception e) {  
	            e.printStackTrace();  
	         }  
	     }  
	 }  


直接编译完成后运行试试结果是怎么样的?

这样很简单吧!又好理解。




分享到:
评论

相关推荐

    java rmi远程调用

    最近在学习代理模式,用到了java rmi远程调用,包含服务端和客户端,之前一直没有接触过,学习了java rmi远程调用,一方面可以了解代理模式,一方面熟悉java低层的远程

    Java RMI 远程调用实例.rar

    Java RMI 远程调用实例,各个文件的作用:  DISPLAYPERFECTTIME.JAVA|:向rmiregistry查找PerfectTime对象,定义调用远程对象的方法。  PERFECTTIME.JAVA:向RMI注册服务,以便客户端查找,创建提供注册服务的本地...

    JAVA RMI远程调用方法代码

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

    java 实现RMI远程调用

    实现java RMI 远程调用,包括 RMIServer RMIClient源码,测试用例。

    java rmi远程方法调用 客户端

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

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

    Java远程调用(Remote Method Invocation,RMI)是Java平台中一种重要的分布式计算技术,它允许在不同网络环境中的Java对象之间进行透明的交互。在本文中,我们将深入探讨三种不同的RMI实现方法:原始方式、Spring...

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

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

    Java RMI 远程方法调用

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

    Java RMI(远程方法调用)Demo

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

    RMI远程调用代码及使用方法

    ### RMI远程调用代码及使用方法 #### 一、RMI简介 远程方法调用(Remote Method Invocation,简称RMI)是Java平台提供的一种分布式计算技术,它允许开发人员在不同的Java虚拟机(JVM)之间进行对象的远程调用。通过...

    通过Java RMI实现远程调用的一个简单例子

    这个简单的例子将引导我们了解如何利用Java RMI实现远程调用。 首先,我们要创建远程接口。在Java RMI中,远程接口是一个实现了`java.rmi.Remote`接口的Java接口。接口中声明的方法将在客户端调用,实际上会在...

    Java RMI远程方法调用

    Java RMI(Remote Method Invocation,远程方法调用)是Java平台提供的一种分布式计算技术,它允许Java对象在不同的网络环境中进行交互,就像调用本地方法一样。RMI系统的核心概念是客户端可以调用服务器端的对象上...

    RMI远程调用

    总结来说,RMI远程调用是Java实现分布式计算的关键技术,它通过简化网络编程,使开发者能专注于业务逻辑,而非底层通信细节。结合Spring框架,可以进一步提升RMI应用的开发效率和可维护性。在实际项目中,合理利用...

    java 远程方法调用(java rmi)

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

    java rmi 远程方法调用 服务端

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

    java RMI客户端调用远程服务器系统命令

    这些方法必须抛出`java.rmi.RemoteException`,因为远程调用过程中可能会出现网络通信问题。例如: ```java public interface MyRemoteInterface extends Remote { void executeCommand(String cmd) throws ...

    rmi远程调用读取文件

    在这个场景中,“rmi远程调用读取文件”指的是通过RMI机制,使得一个JVM中的程序能够请求另一个JVM上的程序读取并返回文件内容。这种方式在分布式系统中非常常见,可以用于数据共享、文件服务等应用。 RMI的基本...

    RMI实现的远程调用

    4. ** stubs 和 skeletons**:在RMI中,远程对象的引用在客户端是通过stubs(桩)表示的,而实际的远程调用则由serverside的skeleton(骨架)处理。现代的JVM已经不再需要手动生成stubs和skeletons,它们由Java...

    动态代理与RMI远程调用

    在提供的`动态代理与RMI远程调用.ppt`中,可能会详细解释这两个概念,通过PPT的讲解和实例,可以更直观地理解动态代理和RMI的工作原理。同时,`src`目录下的源码文件则提供了具体的实现示例,读者可以通过阅读代码,...

    java远程调用rmi实例

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

Global site tag (gtag.js) - Google Analytics