-1
> 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 的连接,如果我尝试从另一台机器连接它,它会拒绝它。怎么回事?!如果我将其实际机器的主机名或 IP 地址而不是 localhost 或 127.0.0.1 放入 Java 服务器,那么它确实接受来自其他地方的连接。双WTF?!

当我使用老式同步服务器时没有这样的问题——当我将它绑定到本地主机端口时,它接受来自本地机器和外部机器的连接。此外,当我都设置为绑定到 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 应该有什么解决方法,它会起作用吗?

4

1 回答 1

0

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

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

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

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

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

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

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

我建议这就是你在有效的情况下所做的事情。

于 2013-01-12T02:24:57.363 回答