源碼目錄結構(服務器端和客戶端放在同一項目的不同包中):
若要分開,服務器端可以直接把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;
}
}