OpenJDK 7 AsynchronousServerSocketChannel只接受localhost,如果绑定到localhost / 127.0.0.1而不是外部

时间:2013-01-12 00:20:47

标签: linux networking nio openjdk nio2

> java -version
java version "1.7.0_09"
OpenJDK Runtime Environment (IcedTea7 2.3.3) (suse-3.16.1-x86_64)
OpenJDK 64-Bit Server VM (build 23.2-b09, mixed mode)

在openSUSE 12.2(x86_64)上,AppArmor 正在运行,防火墙已禁用

如果使用AsynchronousServerSocketChannel的服务器正在侦听连接,并且我指定localhost或127.0.0.1,那么接受来自localhost的连接,如果我尝试从另一台机器连接,则拒绝它。 WTF?!如果我改为在Java服务器中放入其实际机器的主机名或IP地址,而不是localhost或127.0.0.1,那么它确实接受来自其他地方的连接。 双重WTF?

当我使用老式同步服务器时没有这样的问题 - 当它绑定到localhost端口时,它接受来自本地计算机和外部计算机的连接。此外,我注意到当我设置绑定到localhost时,同步和NIO2之间存在以下差异:

> netstat -ltupn | grep
tcp      0    0 :::2340               :::*              LISTEN    6749/java
tcp      0    0 127.0.0.1:12401       :::*              LISTEN    6767/java

这对我来说是一个大问题,因为我计划将此服务器部署到多台计算机上,如果要更改每一台计算机上的配置文件以添加实际主机名,那将是一件非常痛苦的事情。 IP而不是localhost。什么是修复,所以如果我指定localhost应该可以工作?

1 个答案:

答案 0 :(得分:0)

  

我指定localhost或127.0.0.1,然后它只接受来自localhost的连接,如果我尝试从另一台机器连接它拒绝它。 WTF?!

这正是它应该做的事情。您指定了127.0.0.1,这是环回接口,并且从外部主机不可见。

  

如果我改为在Java服务器中放入其实际机器的主机名或IP地址,而不是localhost或127.0.0.1,那么它确实接受来自其他地方的连接。双WTF?!

再一次,这正是应该发生的事情。我不知道为什么你会这么惊讶。

  

当我使用老式同步服务器时没有这样的问题 - 当它绑定到本地主机端口时,它接受来自本地计算机和外部计算机的连接。

事实并非如此。你的观察是错误的。

两种情况下的正确解决方案是绑定到0.0.0.0或null InetAddress,或省略绑定到INADDR_ANY的所有参数都具有相同效果的参数,这意味着在这种情况下通过任何接口接受连接。

我建议你这样做是有效的。