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();
}
}
}