RMI即Remote Method Invocation,遠端方法調用,一種計算機之間利用遠端對象互相調用實作雙方通訊的一種通訊機制。使用這種機制,某一台計算機上的對象可以調用另外一台計算機上的對象來擷取遠端資料,原先的程式在同一作業系統的方法調用,變成了不同作業系統之間程式的方法調用!在Hessian章節中也大緻講解了遠端調用相關的知識,再給大家舉個形象一點的例子,比如你有一台支援java的手機 還有一台桌上型電腦 手機上又一個非常複雜的運算 如果用手機來計算的話可能需要很長時間 不過如果用桌上型電腦的話幾秒就能算出結果,這個時候就是rmi大顯神通的時候 使用rmi從手機發送請求 然後交給桌上型電腦計算 然後桌上型電腦傳回計算後的結果,這就是在不同的機器上面不同的JVM中實作了方法的遠端調用!前面我們使用了Hessian,它是要部署在伺服器裡面才能運作的,并且它還需要輔助的jar包支援,下面我們來看一下java裡面自己支援的RMI,它是最原始的遠端方法調用,服務可以是BS、也可以是CS平台!下面來學習學習吧:
1、建立一個java工程(RMIServer),跟Hessian一樣,編寫我們的實體類和建立遠端接口和相應的方法:
實體類,因為要進行遠端傳輸,是以必須實作Serializable接口:
package com.server.bean;
import java.io.Serializable;
/**
* 服務建立一個Model層,注意因為此對象需要現實進行遠端傳輸,是以必須繼承Serializable
* @author harderxin
*
*/
public class User implements Serializable{
/**
*
*/
private static final long serialVersionUID = 7175134832651443717L;
//使用者編号
private int id;
//使用者名
private String userName;
//密碼
private String password;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public User(int id, String userName, String password) {
super();
this.id = id;
this.userName = userName;
this.password = password;
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + id;
result = prime * result
+ ((password == null) ? 0 : password.hashCode());
result = prime * result
+ ((userName == null) ? 0 : userName.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
User other = (User) obj;
if (id != other.id)
return false;
if (password == null) {
if (other.password != null)
return false;
} else if (!password.equals(other.password))
return false;
if (userName == null) {
if (other.userName != null)
return false;
} else if (!userName.equals(other.userName))
return false;
return true;
}
}
建立遠端接口和相應的方法,需要繼承java中的Remote
package com.server.service;
import java.rmi.Remote;
import java.rmi.RemoteException;
import java.util.List;
import com.server.bean.User;
//該類為遠端調用接口,必須繼承Remote類
public interface UserService extends Remote{
public List<User> getUser()throws RemoteException;
}
建立遠端接口實作類,實作類需要繼承java中的UnicastRemoteObject
package com.server.service.impl;
import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;
import java.util.ArrayList;
import java.util.List;
import com.server.bean.User;
import com.server.service.UserService;
/**
* 建立UserServiceImpl實作遠端接口,
* 注意此為遠端對象實作類,需要繼承UnicastRemoteObject
* @author dell
*
*/
public class UserServiceImpl extends UnicastRemoteObject implements UserService{
/**
*
*/
private static final long serialVersionUID = -4329943273988736513L;
public UserServiceImpl() throws RemoteException {
super();
}
public List<User> getUser() throws RemoteException{
//我們可以在這個方法中與資料庫打交道
List<User> list=new ArrayList<User>();
list.add(new User(1,"Mary","123456"));
list.add(new User(2,"Jack","236547"));
list.add(new User(3,"Joy","362541"));
return list;
}
}
2、編寫我們的服務端啟動類,注冊通訊端口和通訊路徑,能夠讓我們的用戶端進行通路:
package com.server.start;
import java.rmi.Naming;
import java.rmi.registry.LocateRegistry;
import com.server.service.UserService;
import com.server.service.impl.UserServiceImpl;
public class Server {
public static void main(String[] args) {
try {
UserService userService=new UserServiceImpl();
//注冊通訊端口
LocateRegistry.createRegistry(8081);
//注冊通訊路徑
Naming.rebind("rmi://127.0.0.1:8081/UserService", userService);
System.out.println("server start.....");
} catch (Exception e) {
e.printStackTrace();
}
}
}
執行main函數,我們的服務即啟動了!将接口類UserService和實體類User打成jar包,放到我們的用戶端中,讓用戶端去通路調用,或者也可以在用戶端編寫和服務端接口、實體一樣的類(包名稱也要相同,不建議這樣做)
下面開始編寫我們的用戶端進行通路
3、建立一個java工程(RMIClient),導入從服務端打的jar包,編寫我們的測試類:
package com.server.start;
import java.rmi.Naming;
import java.util.List;
import com.server.bean.User;
import com.server.service.UserService;
public class ClientTest {
public static void main(String[] args) {
try {
//調用遠端對象,注意RMI路徑與接口必須與伺服器配置一緻
UserService userService=(UserService)Naming.lookup("rmi://127.0.0.1:8081/UserService");
//執行服務端方法
List<User> users=userService.getUser();
//周遊輸出
for(User user:users){
System.out.println("id="+user.getId()+",name="+user.getUserName()+",pwd="+user.getPassword());
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
運作測試類,得到結果:
id=1,name=Mary,pwd=123456
id=2,name=Jack,pwd=236547
id=3,name=Joy,pwd=362541