RMI内外网访问失败

网络连接环境,两台机子+一路由器:
机子A:位于有线通网络,作为RMI客户端
机子B:位于电信网络,作为RMI服务器,连到无线路由器R上,机子B动态分配的IP为192.168.1.100。.
无线路由器R:此路由器接外网,外网IP为58.33.142.177,机子B就是连接它上网的。已在此路由器配置虚拟服务器,将端口1099映射到了192.168.1.100。

当机子A也连到路由器R上面时,A、B之间RMI正常;
当机子A连有线通网络时,能取得服务对象,但却不能调用此对象的接口。

 

服务器主要代码如下:

 

 

 System.setProperty("java.security.policy", Server.class.getResource("server.policy").toString ());  
 System.setProperty("java.rmi.server.hostname","58.33.142.177"); 
System.setSecurityManager(new RMISecurityManager());
            
LocateRegistry.createRegistry(1099);
            
TaskDispatcherImpl taskDispatcherImpl = new TaskDispatcherImpl();
Naming.rebind("rmi://192.168.1.100:1099/TaskDispatcher", taskDispatcherImpl);

 

 

客户端代码如下:

public class Client {
public static void main (String []args) throws Exception { 
try
{
     System.setProperty("java.security.policy", Client.class.getResource("server.policy").toString());
     System.setSecurityManager(new RMISecurityManager());
     Registry reg =LocateRegistry.getRegistry("58.33.142.177", 1099);
     TaskDispatcher taskDispatcher=(TaskDispatcher)reg.lookup("TaskDispatcher");   // 这一步能执行过去,取得的实际对象类型是TaskDispatcher_Stub

     TaskInfo taskInfo = taskDispatcher.getTaskInfo();   // 这一步会抛出异常
}
catch(RemoteException re)  {  re.printStackTrace ();  } 

 

}

  异常信息如下:

java.rmi.ConnectException: Connection refused to host: 58.33.142.177; nested exception is:

java.net.ConnectException: Connection timed out: connect

at sun.rmi.transport.tcp.TCPEndpoint.newSocket(TCPEndpoint.java:601)

...

 

请帮我看看这是什么原因造成的,该怎么改,谢谢!

 

RMI服务会开启两个端口,一个注册端口,一个是通讯端口,其中通讯端口
默认是随机的,需要把通讯端口固定下来,然后再路由器上做映射。
具体参见:
[url]http://blog.csdn.net/ktyl2000/article/details/4485896[/url]

你的:
System.setProperty和Naming.rebind的ip要一致吧。。

property的ip也要服务器端的ip:192.168.1.100才行