注意:Server端和Client端的所有類所在的包名要相同
在阿里雲控制檯設置防火牆,允許訪問需要用到的端口。這裏需要用到8801和8501端口
Server端:
定義HelloService接口:
package pakg;
import java.rmi.Remote;
import java.rmi.RemoteException;
public interface HelloService extends Remote{
String sayHello(String someOne) throws RemoteException;
}
HelloServiceImpl類:
package pakg;
import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;
public class HelloServiceImpl extends UnicastRemoteObject implements HelloService {
protected HelloServiceImpl() throws RemoteException {
super();
}
@Override
public String sayHello(String someOne) throws RemoteException {
return "hello," + someOne;
}
}
CustomerSocketFactory類:(這個類用來指定通訊端口,防止被防火牆攔截)
package pakg;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.rmi.server.RMISocketFactory;
public class CustomerSocketFactory extends RMISocketFactory {
@Override
public Socket createSocket(String host, int port) throws IOException {
return new Socket(host, port);
}
@Override
public ServerSocket createServerSocket(int port) throws IOException {
if (port == 0) {
port = 8501;
}
System.out.println("rmi notify port:" + port);
return new ServerSocket(port);
}
}
ServiceMain 類:
package pakg;
import java.rmi.Naming;
import java.rmi.registry.LocateRegistry;
import java.rmi.server.RMISocketFactory;
public class ServiceMain {
public static void main(String[] args) throws Exception{
//
System.setProperty("java.rmi.server.hostname","服務器的公網ip");
//指定通訊端口,防止被防火牆攔截,必須在註冊端口之前調用
RMISocketFactory.setSocketFactory(new CustomerSocketFactory());
LocateRegistry.createRegistry(8801);
HelloService helloService = new HelloServiceImpl();
Naming.rebind("rmi://localhost:8801/helloService",helloService);
System.out.println("ServiceMain provide RPC service now.");
}
}
Client端:
定義HelloService接口:
package pakg;
import java.rmi.Remote;
import java.rmi.RemoteException;
public interface HelloService extends Remote{
String sayHello(String someOne) throws RemoteException;
}
ClientMain類:
package pakg;
import java.rmi.Naming;
public class ClientMain {
public static void main(String[] args)throws Exception {
//服務引入
HelloService helloService = (HelloService) Naming.lookup("rmi://服務器公網ip:8801/helloService");
//調用遠程方法
System.out.println("RMI服務器返回的結果是 "+helloService.sayHello("xiaoming"));
}
}
把Server端的項目打包成可執行jar包,上傳到服務器運行之後
客戶端返回結果: