gpt4 book ai didi

linux - 如果绑定(bind)到 localhost/127.0.0.1 而不是外部,OpenJDK 7 AsynchronousServerSocketChannel 仅接受 localhost

转载 作者:太空宇宙 更新时间:2023-11-04 05:31:31 31 4
gpt4 key购买 nike

> 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?!

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

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

这对我来说是一个大问题,因为我计划将此服务器部署到多台计算机上,并且必须更改每台计算机上的配置文件以添加实际的主机名/IP 而不是本地主机,这将是一个很大的痛苦。如果我按应有的方式指定 localhost,那么修复是什么,它将起作用?

最佳答案

I specify localhost or 127.0.0.1, then it only accepts connections from the localhost and if I try to connect from another machine it rejects it. WTF?!

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

If I instead put in the Java server its actual machine's hostname or IP address, rather than localhost or 127.0.0.1, then it does accept connections from elsewhere. Double WTF?!

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

There's no such issue when I use old-school synchronous server--it accepts connections from both the local machine and external ones when I have it bind to a localhost port.

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

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

我建议这就是您在有效案例中所做的事情。

关于linux - 如果绑定(bind)到 localhost/127.0.0.1 而不是外部,OpenJDK 7 AsynchronousServerSocketChannel 仅接受 localhost,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14288784/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com