> 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应该可以工作?
答案 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
的所有参数都具有相同效果的参数,这意味着在这种情况下通过任何接口接受连接。
我建议你这样做是有效的。