这里描述的是RMI服务端怎么绑定到IP和固定端口。
当机器有多个IP,并且防火墙要求固定服务端口时就有用了
这个过程包括了RMI的基本典型应用,既有服务端的远程对象导出也有客户端的远程对象导出.完整地固定了两段的IP和端口.
原理是在创建远程对象注册表和导出远程对象时使用自己写的SocketFactory来
创建Socket和ServerSocket。
1.写个类,实现RMIClientSocketFactory和RMIServerSocketFactory接口.
import java.io.IOException;
import java.io.Serializable;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;
import java.rmi.server.RMIClientSocketFactory;
import java.rmi.server.RMIServerSocketFactory;
public class StaticRmiSocketFactory implements RMIClientSocketFactory,
RMIServerSocketFactory, Serializable
{
private static final long serialVersionUID = 1L;
private String staticIp;
private int staticPort;
public StaticRmiSocketFactory(String ip, int port)
{
this.staticIp = ip;
this.staticPort = port;
}
public Socket createSocket(String ip, int port) throws IOException
{
System.out.println("create client socket " + this.staticIp + ":" + this.staticPort);
return new Socket(this.staticIp, this.staticPort);
}
public ServerSocket createServerSocket(int port) throws IOException
{
System.out.println("create server socket " + this.staticIp + ":" + this.staticPort);
return new ServerSocket(this.staticPort, 0, InetAddress
.getByName(this.staticIp));
}
}
2. 服务接口和服务实现类:
服务接口:
import java.rmi.Remote;
import java.rmi.RemoteException;
public interface ServerService extends Remote
{
public void serverMethod(ClientService cs) throws RemoteException;
}
服务实现类:
import java.rmi.RemoteException;
import java.rmi.server.RMIClientSocketFactory;
import java.rmi.server.RMIServerSocketFactory;
import java.rmi.server.UnicastRemoteObject;
public class SomeServiceImpl extends UnicastRemoteObject implements ServerService
{
private static final long serialVersionUID = 1L;
protected SomeServiceImpl(int port, RMIClientSocketFactory csf,
RMIServerSocketFactory ssf) throws RemoteException
{
super(port, csf, ssf);
}
public void serverMethod(ClientService cs) throws RemoteException
{
String ip = cs.clientMethod("server method send value");
System.out.println("server method print ++ client method return is :" + ip);
}
}
3.RMI服务端绑定过程:
import java.rmi.AlreadyBoundException;
import java.rmi.RemoteException;
import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;
public class Server
{
public static void main(String[] args) throws RemoteException, AlreadyBoundException
{
String serverIp = "192.168.0.107";
String regIP = serverIp;
int regPort = 10001;
StaticRmiSocketFactory regFac = new StaticRmiSocketFactory(regIP, regPort);
Registry reg = LocateRegistry.createRegistry(regPort, regFac, regFac);
String exportIp = serverIp;
int exportPort = 10002;
StaticRmiSocketFactory exportFac = new StaticRmiSocketFactory(exportIp, exportPort);
ServerService ss = new SomeServiceImpl(exportPort, exportFac, exportFac);
reg.bind("SomeService", ss);
while(true)
{
try
{
Thread.sleep(10000);
} catch (InterruptedException e)
{
e.printStackTrace();
}
}
}
}
4.客户端远程方法接口
import java.io.Serializable;
import java.rmi.Remote;
import java.rmi.RemoteException;
public interface ClientService extends Remote, Serializable
{
public String clientMethod(String a) throws RemoteException;
}
5. 客户端远程方法接口实现
import java.rmi.RemoteException;
import java.rmi.server.RMIClientSocketFactory;
import java.rmi.server.RMIServerSocketFactory;
import java.rmi.server.UnicastRemoteObject;
public class ClientServiceImpl extends UnicastRemoteObject implements
ClientService
{
protected ClientServiceImpl(int arg0, RMIClientSocketFactory arg1,
RMIServerSocketFactory arg2) throws RemoteException
{
super(arg0, arg1, arg2);
}
private static final long serialVersionUID = 1L;
public String clientMethod(String a) throws RemoteException
{
System.out.println("client method arg value:" + a);
return "client method return value";
}
}
6.RMI客户端绑定过程:
import java.net.MalformedURLException;
import java.rmi.Naming;
import java.rmi.NotBoundException;
import java.rmi.RemoteException;
public class Client
{
public static void main(String[] args) throws MalformedURLException,
RemoteException, NotBoundException
{
String ServerIP = "192.168.0.107";
int serverRegPort = 10001;
String clientIP = "127.0.0.1";
int clientPort = 10003;
StaticRmiSocketFactory expFac = new StaticRmiSocketFactory(clientIP,
clientPort);
ClientService cs = new ClientServiceImpl(0, expFac, expFac);
String url = "rmi://" + ServerIP + ":" + serverRegPort + "/SomeService";
ServerService ss = (ServerService) Naming.lookup(url);
ss.serverMethod(cs);
while (true)
{
try
{
Thread.sleep(10000);
} catch (InterruptedException e)
{
e.printStackTrace();
}
}
}
}
转载http://blog.sina.com.cn/s/blog_3ea9cc220100et3t.html