问题是这样的,通过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文件的事,那么应该怎么改,谢~!