天天看點

學習筆記:JAVA RMI遠端方法調用簡單執行個體

RMI的概念

  RMI的開發步驟

  先建立遠端接口及聲明遠端方法,注意這是實作雙方通訊的接口,需要繼承Remote

  開發一個類來實作遠端接口及遠端方法,值得注意的是實作類需要繼承UnicastRemoteObject

  通過javac指令編譯檔案,通過java -server 指令注冊服務,啟動遠端對象

  最後用戶端查找遠端對象,并調用遠端方法

  簡單執行個體

  首先為服務建立一個Model層,注意因為此對象需要現實進行遠端傳輸,是以必須繼承Serializable

package rmi.model;

import java.io.Serializable;

//注意對象必須繼承Serializable

publicclass PersonEntity implements Serializable {

privateint id;

private String name;

privateint age;

publicvoid setId(int id) {

this.id = id;

}

publicint getId() {

return id;

publicvoid setName(String name) {

this.name = name;

public String getName() {

return name;

publicvoid setAge(int age) {

this.age = age;

publicint getAge() {

return age;

  建立遠端接口PersonService,注意遠端接口需要繼承Remote

package rmi.service;

import java.rmi.Remote;

import java.rmi.RemoteException;

import java.util.List;

import rmi.model.*;

//此為遠端對象調用的接口,必須繼承Remote類

public interface PersonService extends Remote {

public List<PersonEntity> GetList() throws RemoteException;

  建立PersonServiceImpl實作遠端接口,注意此為遠端對象實作類,需要繼承UnicastRemoteObject

package rmi.serviceImpl;

import java.rmi.server.UnicastRemoteObject;

import java.util.LinkedList;

import rmi.model.PersonEntity;

import rmi.service.*;

//此為遠端對象的實作類,須繼承UnicastRemoteObject

public class PersonServiceImpl extends UnicastRemoteObject implements PersonService {

public PersonServiceImpl() throws RemoteException {

super();

// TODO Auto-generated constructor stub

public List<PersonEntity> GetList() throws RemoteException {

// TODO Auto-generated method stub

System.out.println("Get Person Start!");

List<PersonEntity> personList=new LinkedList<PersonEntity>();

PersonEntity person1=new PersonEntity();

person1.setAge(25);

person1.setId(0);

person1.setName("Leslie");

personList.add(person1);

PersonEntity person2=new PersonEntity();

person2.setAge(25);

person2.setId(1);

person2.setName("Rose");

personList.add(person2);

return personList;

  建立伺服器端,在伺服器端注冊RMI通訊端口與通訊路徑,然後通訊javac指令編譯檔案,通過java -server 指令注冊服務。以下面代碼為例,如果閣下将項目建立于D:\\RMI\RemotingService檔案夾上時,則先輸入D:\\RMI\RemotingService\src>javac rmi/remotingservice/Program.java擷取Program.class(如何閣下使用的MyEclipse等開發工具,可跳過此步,直接在*/bin檔案夾中直接調用已經生成的Program.class),然後輸入D:\\RMI\RemotingService\src>java rmi/remotingservice/Program啟動服務。

package rmi.remotingservice;

import java.rmi.Naming;

import java.rmi.registry.LocateRegistry;

import rmi.serviceImpl.*;

public class Program{

public static void main(String[] args) {

try {

PersonService personService=new PersonServiceImpl();

//注冊通訊端口

LocateRegistry.createRegistry(6600);

//注冊通訊路徑

Naming.rebind("rmi://127.0.0.1:6600/PersonService", personService);

System.out.println("Service Start!");

} catch (Exception e) {

// TODO Auto-generated catch block

e.printStackTrace();

 最後建立用戶端進行測試,注意客戶調用的RMI路徑必須伺服器配置一緻

package rmi.remotingclient;

public class Program {

public static void main(String[] args){

try{

//調用遠端對象,注意RMI路徑與接口必須與伺服器配置一緻

PersonService personService=(PersonService)Naming.lookup("rmi://127.0.0.1:6600/PersonService");

List<PersonEntity> personList=personService.GetList();

for(PersonEntity person:personList){

System.out.println("ID:"+person.getId()+" Age:"+person.getAge()+" Name:"+person.getName());

}catch(Exception ex){

ex.printStackTrace();

  常見錯誤

  在指令提示符調用java指令時,顯示并無此指令。這是因為未在“環境變量”中綁定JAVA的JDK指令造成的,你首先單擊“計算機右鍵”->“屬性”->“進階”->“環境變量”。在系統變量Path設定中加載為JDK的路徑  .;D:\Program Files\Genuitec\Common\binary\com.sun.java.jdk.win32.x86_1.6.0.013\bin。然後在ClassPath加載伺服器端的Program.class位址 .;D:\\RMI\RemotingService\bin

  在調用javac指令時出現“javac 找不到檔案 ..... ”此錯誤,可能是因為閣下輸入的檔案路徑出現錯誤造成,注意不要把D:\\RMI\RemotingService\src>javac rmi/remotingservice/Program.java寫錯為D:\\RMI\RemotingService\src>javac rmi.remotingservice.Program.java

  在調用D:\\RMI\RemotingService\bin>java rmi/remotingservice/Program指令時出現“Exception in thread 'main' java.lang.NoClassEdfoundError”錯誤,第一這可能是閣下把Program錯寫為Program.class,注意java指令不需要加字尾名。第二可能是閣下把“java rmi/remotingservice/Program”錯寫為“java rmi\remotingservice\Program"。   

最新内容請見作者的GitHub頁:http://qaseven.github.io/