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包,上傳到服務器運行之後


 

客戶端返回結果:

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