注意: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包,上传到服务器运行之后
客户端返回结果: