2 oppo117 oppo117 于 2014.04.01 17:34 提问

java rmi连接远程主机问题
rmi

问题是这样的,通过rmi来实现分布式通信,用的是20112端口,在本地实现的时候是没问题的,但是部署到主机(亚马逊云机,供外访问ip:54.**.72.52,内部IP是10.0.3.9,有防火墙,但是已经打开20112和20110端口),就不能访问了,错误

java.rmi.ConnectionException:Connetcion refused to host:10.0.3.9;nested exception:              java.net.connetionException:connetion time out

(我奇怪:外部ip既然能连上,怎么会卡到10.0.3.9那里啊,不应该是一台机子吗?)
然后我在网上找答案:他们说20112端口是rmi通信端口,而数据发送还需要一个端口,需重写一个类,然后我就写了:

public class MyRMISocket extends RMISocketFactory {
public Socket createSocket(String host, int port) throws IOException {
    System.out.println("client socket"+host+":"+port);
    return new Socket(host, port);
}
@Override
public ServerSocket createServerSocket(int port) throws IOException {
    if (port == 0) {
        System.out.println("original port is 0");
        port = 20110; //不指定就随机分配了 
    }

// port=dataPort;
System.out.println("prot"+port);
return new ServerSocket(port);
}
}

按照网上的说法:指定20110来设置固定的端口来穿越防火墙,但是我设置之后,在本地测试的时候发现打印的log根本就没使用这个20110,还是rmi的我指定的那个端口20112,这是为什么,难道在一个网段里面不需要另起端口,还是我的理解有错误?
下面是我的服务端和客户端的连接代码
server:

  UpdateGatway gatway1=new UpdateGatwayImpl();
        RMISocketFactory.setSocketFactory (new MyRMISocket()); 
        System.setProperty("java.rmi.server.hostname", "54.**.72.52");
        Registry registry1=LocateRegistry.createRegistry(20112);
        registry1.rebind("vernumberGW", gatway1);

(用Naming绑定的时候出错,就用registry来绑定了)
client:

 UpdateGatway gatway1 = (UpdateGatway) Naming.lookup("//54.**.72.52:20112/vernumberGW");

如果放到局域网通信没问题,那个服务器是windows系统,我试了
system.setproperty("java.rmi.server.hostname","54.**.72.52")
重写RmiSocketFactory的方法
到现在都不行,只要放到服务器就报错,我在网上看到说要设置 host文件,我也试了,好像没效果,况且他们说的太笼统,我把服务器上的host文件也粘出来吧,大家看看是哪儿的问题,

#127.0.0.1 localhost

我把前面的注释去掉也不行,各位看看是哪儿的问题,如果是host文件的事,那么应该怎么改,谢~!

1个回答

wangyaninglm
wangyaninglm   Ds   Rxr 2015.01.19 22:25
Csdn user default icon
上传中...
上传图片
插入图片