RMI远程调用阿里云服务器的方法demo

注意: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包,上传到服务器运行之后


 

客户端返回结果:

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章