RPC/RMI實驗

在這裏插入圖片描述

源碼目錄結構(服務器端和客戶端放在同一項目的不同包中):
在這裏插入圖片描述
若要分開,服務器端可以直接把RMIclient包刪掉
客戶端可以這樣:
在這裏插入圖片描述
源碼:
1.服務器端:
BOOK.java:

package RMIserve;

import java.rmi.Remote;
import java.rmi.RemoteException;
import java.util.LinkedList;

public interface IBOOK extends Remote{

	public boolean add(BOOK b) throws RemoteException;
	public BOOK queryByID(int bookID) throws RemoteException;
	public LinkedList<BOOK> queryByName(String name) throws RemoteException;
	public boolean delete(int bookID) throws RemoteException;
	
}

IBOOK.java

package RMIserve;

import java.rmi.Remote;
import java.rmi.RemoteException;
import java.util.LinkedList;

public interface IBOOK extends Remote{

	public boolean add(BOOK b) throws RemoteException;
	public BOOK queryByID(int bookID) throws RemoteException;
	public LinkedList<BOOK> queryByName(String name) throws RemoteException;
	public boolean delete(int bookID) throws RemoteException;
	
}

IBOOKIMPL.java

package RMIserve;

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


//接口的實現
public class IBOOKIMPL extends UnicastRemoteObject implements IBOOK {
    private static final long serialVersionUID = 1L;

	private static LinkedList<BOOK> BOOKDB = new LinkedList<BOOK>();

	protected IBOOKIMPL() throws RemoteException {
		// TODO 自動生成的構造函數存根
	}


	public boolean add(BOOK b) throws RemoteException {
		
		return BOOKDB.add(b);
	}

	@Override
	public BOOK queryByID(int bookID) throws RemoteException {
		// TODO 自動生成的方法存根
		BOOK b = null;
		for(BOOK book:BOOKDB) {
			if(book.getID()==bookID) {
				b = book;
			}
		}
		return b;
	}

	public LinkedList<BOOK> queryByName(String name)  throws RemoteException {
		// TODO 自動生成的方法存根
		LinkedList<BOOK> B = new LinkedList<BOOK>();
		for(BOOK book:BOOKDB) {
			if(book.getName().equals(name)) {
				B.add(book);
			}
		}
		return B;
	}

	@Override
	public boolean delete(int bookID)  throws RemoteException {
		// TODO 自動生成的方法存根
		for(BOOK book:BOOKDB) {
			if(book.getID()==bookID) {
				return BOOKDB.remove(book);
			}
		}
		return false;
	}


}

Server.java:

package RMIserve;

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

public class Server {

	public static void main(String[] args) {
		// TODO 自動生成的方法存根
		try {
			LocateRegistry.createRegistry(6666);
			IBOOK bookutil = new IBOOKIMPL();
			Naming.bind("rmi://localhost:6666/BOOKUtil", bookutil);
            System.out.println("------------遠程對象BOOKUtil註冊成功,等待客戶端調用...");		
		} catch (RemoteException e) {
			// TODO 自動生成的 catch 塊
			e.printStackTrace();
		} catch (MalformedURLException e) {
			// TODO 自動生成的 catch 塊
			e.printStackTrace();
		} catch (AlreadyBoundException e) {
			// TODO 自動生成的 catch 塊
			e.printStackTrace();
		}
	}

}

2.客戶端
CLIENT.java

package RMIclient;

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

import RMIserve.IBOOK;



public class CLIENT {
	
	public static void main(String[] args) {
		
		try {
			IBOOK bookutil =(IBOOK) Naming.lookup("rmi://localhost:6666/BOOKUtil");
			util.setBookutil(bookutil);
			System.out.println("---------------歡迎使用書籍信息管理系統---------------");
			Scanner input = new Scanner(System.in);
			int choose  = -1;
			while(true) {
				System.out.println("選擇菜單:");
				System.out.println("添加一個書籍對象:  1");
				System.out.println("查詢指定ID號的書籍對象:2");
				System.out.println("按書名查詢書籍對象列表:3");
				System.out.println("刪除指定ID號的書籍對象: 4");
				System.out.println(" 退出系統:   0");
				
				System.out.println("請輸入你所要進行的操作對應序號");	
				choose = input.nextInt();
				switch (choose) {
				case 1:
					util.add();
					break;
				case 2:
					util.queryByID();
					break;
				case 3:
					util.queryByname();
					break;
				case 4:
					util.delete();
					break;
				default:
					System.out.println("輸入無效");
					break;
				}
				
			}
		} catch (MalformedURLException | RemoteException | NotBoundException e) {
			// TODO 自動生成的 catch 塊
			e.printStackTrace();
		}
	}
}

util.java:

package RMIclient;

import java.rmi.RemoteException;
import java.util.LinkedList;
import java.util.Scanner;

import RMIserve.BOOK;
import RMIserve.IBOOK;

public class util {
	
	private static IBOOK bookutil;
	private static Scanner input = new Scanner(System.in);
	public static void add() {
		System.out.println("請輸入添加書籍對象的名稱:");
		String name = input.nextLine();
		BOOK book = new BOOK(name);
		boolean b = false;
		try {
		     b =  bookutil.add(book);
		} catch (RemoteException e) {
			// TODO 自動生成的 catch 塊
			e.printStackTrace();
		}finally {
			if(b==false) {
				System.out.println("添加失敗");	
			}
			else {
				System.out.println("添加成功");
			}
		}
		
	}


	public static void queryByID() {
		System.out.println("請輸入查詢的ID");
		int id = input.nextInt();
		BOOK book = null;
		try {
			 book = bookutil.queryByID(id);
		} catch (RemoteException e) {
			// TODO 自動生成的 catch 塊
			e.printStackTrace();
		}
		if(book==null) {
			System.out.println("沒有此書");
		}
		else {
			System.out.println("該書信息爲:");
			System.out.println(book.toString());
		}
	}
	
	public static void queryByname() {
		System.out.println("請輸入查詢書籍的名稱:");
		String name = input.nextLine();
		LinkedList<BOOK> booklist = new	LinkedList<BOOK>();
		try {
				booklist = bookutil.queryByName(name);
		} catch (RemoteException e) {
			// TODO 自動生成的 catch 塊
			e.printStackTrace();
		}
		if(booklist.size()==0) {
			System.out.println("沒有該名稱的書");
		}else {
			System.out.println("對應書籍信息如下:");
			for(BOOK book:booklist) {
				System.out.println(book.toString());
			}
		}

	}

	public static void delete() {
		System.out.println("請輸入查詢的ID");
		int id = input.nextInt();
		boolean b = false;
		try {
			b = bookutil.delete(id);
		} catch (RemoteException e) {
			// TODO 自動生成的 catch 塊
			e.printStackTrace();
		}finally {
			if(b==false) {
				System.out.println("刪除失敗");
			}else {
				System.out.println("刪除成功");
			}
		}
	}

	public static void setBookutil(IBOOK bookutil) {
		util.bookutil = bookutil;
	}
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章