JAva RMIの例

3884 ワード

1.リモート・インタフェースの定義
注意:Remoteインタフェースを継承する必要があります.リモートで呼び出されるメソッドはRemoteException例外を放出する必要があります.
package services;

import java.rmi.Remote;

import java.rmi.RemoteException;

public interface Calculator extends Remote {

	public long add(long a, long b) throws RemoteException;

	public long sub(long a, long b) throws RemoteException; 

	public long mul(long a, long b) throws RemoteException;

	public long div(long a, long b) throws RemoteException;

}


2.リモートインタフェースの実現
注意:UnicaseRemoteObjectクラスの継承は必須ではありません.クラスを継承しない場合は、リモート・オブジェクトを作成するときに、そのクラスのexportObject静的メソッドでリモート・オブジェクトをRMIシステムに接続する必要があります.
クラスを継承すると、そのサブクラスはRemoteException例外を放出することを宣言する構築方法を提供する必要があります.この構築方法がsuper()を呼び出すと、RMIシステムへの接続とリモートオブジェクトへの初期化が実行されます.
package services.impl;

import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;

import services.Calculator;

public class CalculatorImpl extends UnicastRemoteObject implements Calculator {

	private static final long serialVersionUID = 3964373047936852203L;

	public CalculatorImpl() throws RemoteException {
		super();
	}
	
	@Override
	public long add(long a, long b) throws RemoteException {
		return a+b;
	}

	@Override
	public long div(long a, long b) throws RemoteException {
		return a-b;
	}

	@Override
	public long mul(long a, long b) throws RemoteException {
		return a*b;
	}

	@Override
	public long sub(long a, long b) throws RemoteException {
		return a/b;
	}

}

3.サーバ側
package server;

import java.rmi.RemoteException;
import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;

import services.Calculator;
import services.impl.CalculatorImpl;
/**
 *   RMI   ,  RMI  ,         RMI    。
 */
public class Server {
	public static void main(String args[]) {

		try {
			//               Registry   ,      8888(Java     1099),       ,              
			Registry registry = LocateRegistry.createRegistry(8888);
			//         
			Calculator calculator = new CalculatorImpl();
			//         RMI      ,    calculator
			registry.rebind("calculator", calculator);
			//           ,URL     :rmi://host:port/name(         )
			// Naming.bind("//localhost:8888/RHello",rhello);

			System.out.println("        !");
		} catch (RemoteException e) {
			System.out.println("          !");
			e.printStackTrace();
		}
	}
}

4.クライアント
package client;

import java.rmi.NotBoundException;
import java.rmi.RemoteException;
import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;

import services.Calculator;

/**
 *      ,                ,     。
 */
public class Client {
	public static void main(String args[]) {
		try {
                        //         ip
                        //               
			Registry registry = LocateRegistry.getRegistry(args[0], 8888);
		        //             “calculator”     	
 			Calculator calculator = (Calculator) registry.lookup("calculator");
			System.out.println("1 + 2 = " + calculator.add(1, 2));
			
		} catch (NotBoundException e) {
			e.printStackTrace();
		} catch (RemoteException e) {
			e.printStackTrace();
		}
	}
}

ソースリンク:http://u.sohu.com/download/11/13196931853518671521181