使用远程服务——RMI(java版)

使用JDK编写RMI示例

RMI概述

The Java Remote Method Invocation (RMI) system allows an object running in one Java virtual machine to invoke methods on an object running in another Java virtual machine. RMI provides for remote communication between programs written in the Java programming language.

java远程方法调用(RMI)允许一个运行在一台java虚拟机上的对象调用一个运行在另一台java虚拟机上的对象的方法。RMI提供了java程序之间的远程通讯。

在RMI之前,对于java开发者来说,远程调用的唯一选择就是CORBA,或者手工编写Socket程序。

创建RMI服务会涉及如下几个步骤:

  1. 编写一个继承于java.rmi.Remote的服务接口;
  2. 编写改服务接口的实现类,类中方法必须抛出java.rmi.RemoteException异常;
  3. 创建客户端stub类和服务端skeleton类;
  4. 启动一个RMI注册表,以便持有这些服务;
  5. 在RMI注册表中注册服务;

关于RMI更详细的解释可参考:java RMI原理详解_Java_xinghun_4的专栏-CSDN博客

编码

新建工程

在eclipse中新建java工程
新建java工程
输入工程名称为rmi-java
工程配置
点击“Finish”,这样就创建了一个空的java工程

目录结构

目录结构
me.aodi包::应用程序跟目录;
me.aodi.model:模拟数据模型;
me.aodi.service:服务接口;
me.aodi.service.impl:接口实现类;

编写rmi功能

  • 新建me.aodi.model.User类模拟数据模型;
package me.aodi.model;

import java.io.Serializable;

public class User implements Serializable {
	private Integer id;
	private String name;
	public Integer getId() {
		return id;
	}
	public void setId(Integer id) {
		this.id = id;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
}

注意:该模型类必须implements Serializable,否则会有java.io.NotSerializableException异常

  • 新建me.aodi.service.UserService接口
package me.aodi.service;

import java.rmi.Remote;
import java.rmi.RemoteException;
import java.util.List;

import me.aodi.model.User;

public interface UserService extends Remote {
	/**
	 * 返回所有user
	 * @return
	 * @throws RemoteException
	 */
	public List<User> all() throws RemoteException;
}

注意:该接口要发布的方法必须throws RemoteException,否则会报java.rmi.server.ExportException: remote object implements illegal remote interface异常

  • 新建me.aodi.service.impl.UserServiceImpl实现类
package me.aodi.service.impl;

import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;
import java.util.ArrayList;
import java.util.List;

import me.aodi.model.User;
import me.aodi.service.UserService;

public class UserServiceImpl extends UnicastRemoteObject implements UserService {

	/**
	 * 默认serial version id
	 */
	private static final long serialVersionUID = 1L;

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

	/**
	 * 模拟返回所有user
	 */
	@Override
	public List<User> all() throws RemoteException
	{
		User user = new User();
		user.setId(1);
		user.setName("用户1");
		List<User> list = new ArrayList<User>(1);
		list.add(user);
		return list;
	}

}

注意:该类必须extends UnicastRemoteObject,否则会报java.io.NotSerializableException异常

  • 新建me.aodi.RmiServer服务端类
package me.aodi;

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

import me.aodi.service.impl.UserServiceImpl;

public class RmiServer {
	public static void main(String[] args) {
		try {
			UserServiceImpl userServiceImpl = new UserServiceImpl();
			
			LocateRegistry.createRegistry(8001);
			
			Naming.rebind("rmi://localhost:8001/user", userServiceImpl);
			
			System.out.println("UserService registed!");
		} catch (RemoteException | MalformedURLException e) {
			e.printStackTrace();
		}
	}
}
  • 新建me.aodi.RmiClient客户端类
package me.aodi;

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

import me.aodi.model.User;
import me.aodi.service.UserService;

public class RmiClient {
	public static void main(String[] args) {
		try {
			UserService userService =  (UserService) Naming.lookup("rmi://localhost:8001/user");
			List<User> users = userService.all();
			System.out.println("userService.all().size:"+users.size());
			if (users.size() > 0) {
				System.out.println("userService.all()[0].name:"+users.get(0).getName());
			}
		} catch (MalformedURLException | RemoteException | NotBoundException e) {
			e.printStackTrace();
		}
		
	}
}

运行实例

  • 编辑后的工程目录结构
    编辑后工程目录结构
  • 运行服务端应用
    在RmiServer打断点,防止程序立马执行完退出
    断点
  • 调试模式运行RmiServer.java
    调试运行RmiServer
    程序会在断点处停止
  • 运行RmiClient.java
    运行RmiClient
    RmiClient运行结束就退出了,控制台留下了运行时我们要输出的信息
    输出结果
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值