启动我的RMI服务器(在ISP下)的问题,以便它可以通过Internet接收远程调用

时间:2010-04-03 01:05:50

标签: java client-server rmi

我正在创建一个客户端/服务器应用程序,其中我的服务器和客户端可以位于相同或不同的计算机上,但两者都在ISP下。

我的RMI计划: -

-Remote Intreface: -

//Calculator.java
public interface Calculator 
      extends java.rmi.Remote { 
public long add(long a, long b) 
    throws java.rmi.RemoteException; 

public long sub(long a, long b) 
    throws java.rmi.RemoteException; 

public long mul(long a, long b) 
    throws java.rmi.RemoteException; 

public long div(long a, long b) 
    throws java.rmi.RemoteException; 

}

远程接口实施: -

//CalculatorImpl.java
public class CalculatorImpl 
extends 
  java.rmi.server.UnicastRemoteObject 
implements Calculator { 

public CalculatorImpl() 
    throws java.rmi.RemoteException { 
    super(); 
} 

public long add(long a, long b) 
    throws java.rmi.RemoteException { 
    return a + b; 
} 

public long sub(long a, long b) 
    throws java.rmi.RemoteException { 
    return a - b; 
} 

public long mul(long a, long b) 
    throws java.rmi.RemoteException { 
    return a * b; 
} 

public long div(long a, long b) 
    throws java.rmi.RemoteException { 
    return a / b; 
} 

}

服务器: -

//CalculatorServer.java
 import java.rmi.Naming;
 import java.rmi.server.RemoteServer;
 public class CalculatorServer {

  public CalculatorServer(String IP) 
  {
    try {

         Calculator c = new CalculatorImpl();

         Naming.rebind("rmi://"+IP+":1099/CalculatorService", c);
        } catch (Exception e) 
          {
            System.out.println("Trouble: " + e);
          }
  }

     public static void main(String args[]) {
     new CalculatorServer(args[0]);
   }
}

客户端: -

//CalculatorClient.java

 import java.rmi.Naming; 
 import java.rmi.RemoteException; 
 import java.net.MalformedURLException; 
 import java.rmi.NotBoundException; 

  public class CalculatorClient { 

  public static void main(String[] args) { 
    try { 
       Calculator c = (Calculator)Naming.lookup("rmi://"+args[0]+"/CalculatorService"); 

        System.out.println( c.sub(4, 3) ); 
        System.out.println( c.add(4, 5) ); 
        System.out.println( c.mul(3, 6) ); 
        System.out.println( c.div(9, 3) ); 
    } 
    catch (MalformedURLException murle) { 
        System.out.println(); 
        System.out.println("MalformedURLException"); 
        System.out.println(murle); 
    } 
    catch (RemoteException re) { 
        System.out.println(); 
        System.out.println("RemoteException"); 
        System.out.println(re); 
    } 
    catch (NotBoundException nbe) { 
        System.out.println(); 
        System.out.println("NotBoundException"); 
        System.out.println(nbe); 
    } 
    catch (java.lang.ArithmeticException ae) { 
        System.out.println(); 
        System.out.println("java.lang.ArithmeticException"); 
        System.out.println(ae); 
    } 
} 

}

当服务器和客户端程序都在同一台机器上时: -

我通过路由器的静态IP地址启动我的服务器程序:-192.168.1.35 在args [0]中,我的服务器启动......很好。

并通过在我的客户端的args [0]中传递相同的静态IP地址也可以正常工作。

但: -

当服务器和客户端程序都在不同的计算机上时: -

现在,我试图通过在args [0]中传递它的公共IP地址:59.178.198.247来启动我的服务器程序,以便它可以通过互联网接收电话。
但是我无法启动它。

并发生以下异常: -

Trouble: java.rmi.ConnectException: Connection refused to host: 59.178.198.247;
nested exception is:
    java.net.ConnectException: Connection refused: connect

我认为这是由于NAT问题,因为我在ISP下。

所以,我的问题是如何在ISP下启动我的RMI服务器,以便它可以从Internet接收远程调用?

2 个答案:

答案 0 :(得分:0)

据推测,您的ISP正在阻止连接。你必须和他们谈谈。

答案 1 :(得分:0)

尝试查看您的端口(1099)是否可见(例如,您可以使用this)。如果没有,请使用开放端口,或编辑防火墙或路由器配置(您可能需要设置端口转发)。如果是,请查看您的RMI安全策略。