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
測試
