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

測试

最新文章

  1. 将报表移动端集成到自有移动端app方法【IOS、Android】
  2. 【leetcode】Reverse Linked List II (middle)
  3. 仿SiteMap实现Asp.net 网站的菜单和权限管理
  4. 实现ScrollView中包含ListView,动态设置ListView的高度
  5. POJ 3009 深度优先搜索
  6. Jquery cookie操作示例,写入cookie,读取cookie,删除cookie
  7. JavaScript(第六天)【函数】
  8. JAVA_SE基础——8.基本数据类型
  9. Objective-C的面向对象特性(一)
  10. Android读写配置2
  11. 举例说明$POST 、$HTTP_RAW_POST_DATA、php://input三者之间的区别
  12. caffe-ssd编译runtest时候报错:g++: internal compiler error: Killed (program cc1plus)
  13. ORACLE查询内存溢出
  14. windows & gcc & mingw & mysy 编译 openssl
  15. php工厂模式的实例
  16. c# 通过反射输出成员变量以及成员变量的值
  17. MFC——CDC
  18. pyrhon3与mysql:查、更、删49
  19. meterpreter lhost设置
  20. IIS 使用多个https和通配证书解决方案

热门文章

  1. python+selenium 鼠标事件操作
  2. Python内置函数(4)
  3. C# 字符串型转数字型
  4. [adb 命令学习篇] adb 命令总结
  5. 北京师范大学第十五届ACM决赛-重现赛
  6. iOS-APP图标和启动页的尺寸
  7. 【Luogu】P2258子矩阵(状态压缩,DP)
  8. 【Luogu】P1586四方定理(DP)
  9. NOIP一系列模拟赛小结
  10. BZOJ 1875 [SDOI2009]HH去散步 ——动态规划 矩阵乘法