Java 使用RMI
Java使用序列化的方式,可以實現遠端的方法調用,在分工合作時非常方便。本文記錄使用java標准庫實現rmi
一、服務端
結構
.
├── pom.xml
├── src
│ ├── main
│ │ └── java
│ │ └── hello
│ │ ├── HelloImpl.java
│ │ ├── HelloServer.java
│ │ └── IHello.java
│ └── test
│ └── java
│ └── mycom
│ └── AppTest.java
└── target
IHello.java
package hello;
import java.rmi.Remote;
import java.rmi.RemoteException;
public interface IHello extends Remote {
public String sayHelloToSomeBody(String someBodyName) throws RemoteException;
HelloImpl.java
package hello;
import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;
public class HelloImpl extends UnicastRemoteObject implements IHello {
public HelloImpl() throws RemoteException {
super();
}
public String sayHelloToSomeBody(String someBodyName) throws RemoteException {
System.out.println("Connected sucessfully!");
return "你好," + someBodyName + "!";
}
}
HelloServer.java
package hello;
import java.net.MalformedURLException;
import java.rmi.AlreadyBoundException;
import java.rmi.Naming;
import java.rmi.RemoteException;
import java.rmi.registry.LocateRegistry;
public class HelloServer {
public static void main(String args[]) {
try {
IHello rhello = new HelloImpl();
LocateRegistry.createRegistry(8888);
// 如果配置在遠程服務器,把地址換成你的ip
System.setProperty("java.rmi.server.hostname","127.0.0.1");
Naming.bind("rmi://localhost:8888/RHello", rhello);
System.out.println(">>>>>INFO:遠程IHello對象綁定成功!");
} catch (RemoteException e) {
System.out.println("創建遠程對象發生異常!");
e.printStackTrace();
} catch (AlreadyBoundException e) {
System.out.println("發生重復綁定對象異常!");
e.printStackTrace();
} catch (MalformedURLException e) {
System.out.println("發生URL畸形異常!");
e.printStackTrace();
}
}
}
在服務端啟動HelloServer.java就會在8888端口監聽請求了
二、客戶端
客戶端只要分享接口文件就好了
啟動代碼
package hello;
import java.net.MalformedURLException;
import java.rmi.Naming;
import java.rmi.NotBoundException;
import java.rmi.RemoteException;
public class Client {
public static void main(String args[]) {
try {
// 填寫服務器ip
IHello rhello = (IHello) Naming.lookup("rmi://127.0.0.1:8888/RHello");
System.out.println(rhello.sayHelloToSomeBody("Erich"));
} catch (NotBoundException e) {
} catch (MalformedURLException e) {
e.printStackTrace();
e.printStackTrace();
} catch (RemoteException e) {
e.printStackTrace();
}
}
}
三、小結
可以看到,客戶端只要得到接口文件就能執行操作,而具體的實現交給服務端完成,這種架構可以解耦調用和實現