RMI もう1つの方法

RMIサンプル rmiregistry を起動しない、接続後の通信ポートを指定
前に、http://blog.zaq.ne.jp/oboe2uran/article/279/で書いたのとは異なり、
クライアント側で、サーバ側と同じ java.rmi.server.RMIClientSocketFactory の実装クラスを
持たなくてはならない!
FireWallで通信できるポートを指定する場合はこの形にするしかないのか。。。
=====サーバ側=========
package test;
public interface Hello extends java.rmi.Remote {
   String sayHello() throws java.rmi.RemoteException;
}
-----------------------------------

public class HelloImpl implements Hello {
   public HelloImpl() {
   public String sayHello() {
      return  "Hello World!";
   }
}
-----------------------------------
import java.io.IOException;
import java.io.Serializable;
import java.net.Socket;
import java.rmi.server.RMIClientSocketFactory;
public class HelloClientSocketFactory implements RMIClientSocketFactory,Serializable{
   private static final long serialVersionUID = 1L;
   public Socket createSocket(String host,int port) throws IOException{
      return new Socket(host,port);
   }
}
-----------------------------------
import java.io.IOException;
import java.net.ServerSocket;
import java.rmi.server.RMIServerSocketFactory;
public class HelloServerSocketFactory implements RMIServerSocketFactory{
   public ServerSocket createServerSocket(int port) throws IOException{
      return new ServerSocket(port);
   }
}
-----------------------------------
import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;
import java.rmi.server.RMIClientSocketFactory;
import java.rmi.server.RMIServerSocketFactory;
import java.rmi.server.UnicastRemoteObject;
// port 50001を指定
public class HelloServer{
   public static void main(String args) {
      System.setProperty("java.security.policy","java.policy");
      /*
       * Create and install a security manager
       */

      if (System.getSecurityManager() == null){
          System.setSecurityManager(new SecurityManager());
      }

      try{
      /*
       * Create remote object and export it to use
       * custom socket factories.
       */

      HelloImpl obj = new HelloImpl();
      RMIClientSocketFactory csf = new HelloClientSocketFactory();
      RMIServerSocketFactory ssf = new HelloServerSocketFactory();
      Hello stub = (Hello)UnicastRemoteObject.exportObject(obj,50001,csf,ssf);
      /*
       * Create a registry and bind stub in registry.
       */

      LocateRegistry.createRegistry(1099);
      Registry registry = LocateRegistry.getRegistry(1099);
      registry.rebind("Hello", stub);


      System.out.println("HelloImpl bound in registry");
      }catch (Exception e) {
         e.printStackTrace();
      }
   }
}


=====クライアント側======
package test;
public interface Hello extends java.rmi.Remote {
   String sayHello() throws java.rmi.RemoteException;
}
-----------------------------------
import java.io.IOException;
import java.io.Serializable;
import java.net.Socket;
import java.rmi.server.RMIClientSocketFactory;
public class HelloClientSocketFactory implements RMIClientSocketFactory,Serializable{
   private static final long serialVersionUID = 1L;
   public Socket createSocket(String host,int port) throws IOException{
      return new Socket(host,port);
   }
}
-----------------------------------
import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;
public class HelloClient {
    public static void main(String args
) {
       System.setProperty("java.security.policy","java.policy");
       /*
        * Create and install a security manager
        */

       if (System.getSecurityManager() == null) {
           System.setSecurityManager(new SecurityManager());
       }
        try{
        Registry registry = LocateRegistry.getRegistry("127.0.0.1",1099);
        Hello obj = (Hello) registry.lookup("Hello");

        String message = obj.sayHello();
        System.out.println(message);

        }catch(Exception e){
            e.printStackTrace();
        }
    }
}