初対面RMI

5066 ワード

リモートメソッド呼び出し(Remote Method Invocation,RMI)は、Javaを使用してJDK 1.1で実装され、Javaが分散アプリケーションを開発する能力を大幅に強化します.Javaは一世を風靡したネットワーク開発言語として、その巨大な威力は分布式ネットワーク応用を開発する能力に現れ、RMIは100%純粋なJavaを開発するネットワーク分布式応用システムの核心解決方案の一つである.実はRPCのJavaバージョンと見なすことができます.しかし,従来のRPCは分散オブジェクトシステムにうまく応用できなかった.Java RMIは、異なるアドレス空間に格納されたプログラムレベルオブジェクト間の通信をサポートし、リモートオブジェクト間のシームレスなリモートコールを実現します.
正常に動作するRMIシステムは、次のいくつかの部分から構成されています.
     .リモート・サービスのインタフェース定義
     ·リモート・サービス・インタフェースの具体的な実装
     ·スタブファイルとフレームファイル
     ·リモート・サービスを実行するサーバ
     ·クライアントがこのリモート・サービスを発見できるRMIネーミング・サービス
     ·クラスファイルのプロバイダ(HTTPまたはFTPサーバ)
     ·このリモート・サービスが必要なクライアント・プログラム
 
 
上記の手順を完了するには、次の手順に従います.
      1、リモートインタフェースを生成する       2、リモートオブジェクトの実現(サーバー側プログラム)       3、占拠プログラムと中堅ネットワークの生成(サーバー側プログラム)       4、サーバープログラムの作成       5、クライアントプログラムの作成       6、リモートオブジェクトの登録       7、リモートオブジェクトの起動
1.リモートインタフェースの作成およびリモートメソッドの宣言(TimerServiceInterface.java)
package com.weiythi.service;

import java.rmi.Remote;
import java.rmi.RemoteException;

public interface ITimeService extends Remote{
	public long getTime() throws RemoteException;
}

 2. リモート・インタフェースおよびリモート・メソッドの実装(UnicastRemoteObjectの継承)TimerServices.java
package com.weiythi.service;

import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;
public class TimerService extends UnicastRemoteObject implements ITimeService{
	private static final long serialVersionUID = 1L;
	/**  
	*         ,         ,           ,        RemoteException    
	*/  
	public TimerService() throws RemoteException{
		
	}
	/**
	 *        
	 */
	@Override
	public long getTime() throws RemoteException {
		return System.currentTimeMillis();
	}
}
 
3.RMI登録サービスを開始し、リモートオブジェクトを登録する
 
   方法1、DOSウィンドウを開いてrmicコマンドを使う
          rmic com.weiythi.service.TimerService    
          RMI登録サービスを開始し、ポートが1099(1099がデフォルト)であることを指定します.   
         start rmiregistry
         リモートオブジェクトの登録(HelloServer.java)
package com.weiythi.service;

import java.net.MalformedURLException;
import java.rmi.AlreadyBoundException;
import java.rmi.Naming;
import java.rmi.RemoteException;

public class StartTimerServer {
	public static void main(String[] args){
		try {
			TimerService timerservice=new TimerService();
			// TimerService   RMI      ,   b1   
			Naming.bind("b1", timerservice);
		} catch (RemoteException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (MalformedURLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (AlreadyBoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
}
 方法2:
package com.weiythi.service;

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

public class StartTimerServer {
	public static void main(String[] args){
		try {
			//  RMI    
	        //        start rmigesitry     
	        //               DOS     
	        //     rmiregistry            RMIC    stub        
	        LocateRegistry.createRegistry(1099);   
			TimerService timerservice=new TimerService();
			// TimerService   RMI      ,   b1   
			Naming.bind("b1", timerservice);
		} catch (RemoteException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (MalformedURLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (AlreadyBoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
}
 
4.クライアントはリモート・オブジェクトを検索し、リモート・メソッド(GetTimerServices.java)package com.weiythi.clientを呼び出します.

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

import com.weiythi.service.ITimeService;

public class GetTimerService {
	public static void main(String[] args){
		try {
			ITimeService time=(ITimeService) Naming.lookup("rmi://localhost/b1");
			System.out.println("the time is:"+time.getTime());
		} catch (MalformedURLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (RemoteException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (NotBoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
}