java远程调用rmi入门实例

RMI是Java的一组拥护开发分布式应用程序API。RMI使用Java语言接口定义了远程对象,它集合了Java序列化和Java远程方法协议(Java
Remote Method Protocol)。简单地说,这样使原先的程序在同一操作系统的方法调用。变成了不同操作系统之间程序的方法调用。因为J2EE是分布式程序平台。它以RMI机制实现程序组件在不同操作系统之间的通信。

比方,一个EJB能够通过RMI调用Web上还有一台机器上的EJB远程方法。

用例server端结构大概如此

首先定义要传送的实体类,由于要网络传输。必须实现序列化

User.java

package com.yiyuwanglu.rmi.entity;

import java.io.Serializable;

public class User implements Serializable {
	/**
	 *
	 */
	private static final long serialVersionUID = -8400949180923337013L;
	private String id;
	private String name;
	private int age;

	public String getId() {
		return id;
	}

	public void setId(String id) {
		this.id = id;
	}

	public String getName() {
		return name;
	}

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

	}

	public int getAge() {
		return age;
	}

	public void setAge(int age) {
		this.age = age;
	}

}

第二定义实体接口,必须继承 java.rmi.Remote

UserService

package com.yiyuwanglu.rmi.service;

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

import com.yiyuwanglu.rmi.entity.User;

public interface UserService extends Remote {
	public User getUserById(String id)throws RemoteException;
}

第三,实现接口 记得继承UnicastRemoteObject

UserServiceImpl

package com.yiyuwanglu.rmi.service.impl;

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

import com.yiyuwanglu.rmi.entity.User;
import com.yiyuwanglu.rmi.service.UserService;

public class UserServiceImpl extends UnicastRemoteObject  implements UserService {

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

	public UserServiceImpl() throws RemoteException {
		super();
		// TODO Auto-generated constructor stub
	}

	@Override
	public User getUserById(String id) {
		User user=new User();
		user.setId(id);
		user.setAge(100);
		user.setName("測试");
		return user;
	}

}

server端启动

Program.java

package com.yiyuwanglu.rmi.program;

import java.net.MalformedURLException;
import java.nio.channels.AlreadyBoundException;
import java.rmi.Naming;
import java.rmi.RemoteException;
import java.rmi.registry.LocateRegistry;  

import com.yiyuwanglu.rmi.service.UserService;
import com.yiyuwanglu.rmi.service.impl.UserServiceImpl;

public class Program{
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        try {
            UserService userService=new UserServiceImpl();
            //注冊通讯端口
            LocateRegistry.createRegistry(6600);
            //注冊通讯路径
            Naming.rebind("rmi://127.0.0.1:6600/userService", userService);
            System.out.println("Service Start!");
        }  catch (RemoteException e) {
            System.out.println("创建远程对象发生异常!

");
            e.printStackTrace();
        } catch (AlreadyBoundException e) {
            System.out.println("发生反复绑定对象异常!

");
            e.printStackTrace();
        } catch (MalformedURLException e) {
            System.out.println("发生URL畸形异常!");
            e.printStackTrace();
        }
    }
}

client測试,最好找还有一台机子(当然同一台机子或许,只是为了模拟真实情况,还是还有一台机子,记得iP要换)创建client。切记:相关的类的包的路径要跟server一样

比如:client的 UserService

package com.yiyuwanglu.rmi.service;

最后client调用

package com.yiyuwanglu.rmi.program;

import java.rmi.Naming;

import com.yiyuwanglu.rmi.entity.User;
import com.yiyuwanglu.rmi.service.UserService;

public class Client {
	 public static void main(String[] args){
	        try{
	            //调用远程对象,注意RMI路径与接口必须与server配置一致
	        	UserService userService=(UserService)Naming.lookup("rmi://127.0.0.1:6600/userService");
	            User user =userService.getUserById("1245");
	             System.out.println(user.getName());
	        }catch(Exception ex){
	            ex.printStackTrace();
	        }
	    }
}
先启动server端
Program
然后启动client
Client

显示结果各自是

Service Start!

client

測试
时间: 2024-11-05 15:45:13

java远程调用rmi入门实例的相关文章

java远程调用(rmi)常见的两个错误

java的 rmi远程调用给分布式编程带来极大的方便,在使用rmi过程中若遇到以下两个问题,可以尝试如下的解决方法 错误 1 : java.rmi.server.ExportException : remote object implements illegal remote interface; nested exception is : java.lang.IllegalArgumentException : illegal remote method encountered : , 解决方

java远程调用RMI

1.RMI RMI是个典型的为java定制的远程通信协议,我们都知道,在single vm中,我们可以通过直接调用java object instance来实现通信,那么在远程通信时,如果也能按照这种方式当然是最好了,这种远程通信的机制成为RPC(Remote Procedure Call),RMI正是朝着这个目标而诞生的. 来看下基于RMI的一次完整的远程通信过程的原理: 1. 客户端发起请求,请求转交至RMI客户端的stub类: 2. stub类将请求的接口.方法.参数等信息进行序列化: 3

分布式服务架构之java远程调用技术浅析

分布式服务架构之java远程调用技术浅析     在分布式服务框架中,一个最基础的问题就是远程服务是怎么通讯的,在Java领域中有很多可实现远程通讯的技术,例如:RMI.MINA.ESB.Burlap.Hessian.SOAP.EJB和JMS等,这些名词之间到底是些什么关系呢,它们背后到底是基于什么原理实现的呢,了解这些是实现分布式服务框架的基础知识,而如果在性能上有高的要求的话,那深入了解这些技术背后的机制就是必须的了,在这篇blog中我们将来一探究竟,抛砖引玉,欢迎大家提供更多的实现远程通讯

Java中间件之RMI及实例介绍 · zijian‘s blog

RMI介绍 ??远程方法调用(Remote Method Invocation)是Sun公司规定的允许在不同的JAVA虚拟机之间进行对象间通信的一种规范.在RMI中,JVM可以位于一个或多个计算机上,其中一个JVM可以调用存储在另一个JVM中的对象方法.这就使得应用程序可以远程调用其他对象方法,从而达到分布式计算的目的,以共享各个系统的资源和处理能力. ??除了RMI外,基于JAVA的实现不同JAVA虚拟机上的应用程序之间通信技术主要有两种:套接字和JAVA消息服务(JMS). ??使用套接字是

Java 远程调用之Hessian简例

1. [代码]1.服务接口(Hello.java) package server; public interface Hello { String hello(String name);}2. [代码]2.接口实现(HelloImpl.java) package server; public class HelloImpl implements Hello{ public String hello(String name) {    return "hello,"+name+"

Java[2] 分布式服务架构之java远程调用技术浅析(转http://www.uml.org.cn/zjjs/201208011.asp)

转自:http://www.uml.org.cn/zjjs/201208011.asp 在分布式服务框架中,一个最基础的问题就是远程服务是怎么通讯的,在Java领域中有很多可实现远程通讯的技术,例如:RMI.MINA.ESB.Burlap.Hessian.SOAP.EJB和JMS等,这些名词之间到底是些什么关系呢,它们背后到底是基于什么原理实现的呢,了解这些是实现分布式服务框架的基础知识,而如果在性能上有高的要求的话,那深入了解这些技术背后的机制就是必须的了,在这篇blog中我们将来一探究竟,抛

Java远程调用

一.  概念: RMI全称是Remote Method Invocation-远程方法调用,其威力就体现在它强大的开发分布式网络应用的能力上,是纯Java的网络分布式应用系统的核心解决方案之一.它支持存储于不同地址空间的程序级对象之间彼此进行通信,实现远程对象的无缝远程调用. 二.原理: 方法调用从客户端对象经占位程序(Stub),远程引用层,和传输层向下传递给主机,然后再次经传输层,向上穿过远程调用层和骨干层,到达服务器对象. 占位程序扮演者远程服务器对象的代理角色,使该对象可被客户激活.远程

java 远程调用 shell

import java.io.BufferedReader; import java.io.ByteArrayInputStream;import java.io.File;import java.io.FileOutputStream;import java.io.InputStream;import java.io.InputStreamReader;import java.io.OutputStream;import java.nio.charset.Charset;import java

java 远程调用 RPC

1. 概念 RPC,全称为Remote Procedure Call,即远程过程调用,它是一个计算机通信协议.它允许像调用本地服务一样调用远程服务.它可以有不同的实现方式.如RMI(远程方法调用).Hessian.Http invoker等.RPC是与语言无关的.直观说法就是A通过网络调用B的过程方法.也就是说两台服务器A,B,一个应用部署在A服务器上,想要调用B服务器上应用提供的函数/方法,由于不在一个内存空间,不能直接调用,需要通过网络来表达调用的语义和传达调用的数据. 1.首先要解决寻址的