RMI IP绑定和端口固定

这里描述的是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

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值