-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 からの接続のみが受け入れられ、別のマシンから接続しようとすると拒否されます。なんてこと?!ローカルホストや 127.0.0.1 ではなく、実際のマシンのホスト名または IP アドレスを Java サーバーに入力すると、別の場所からの接続が受け入れられます。ダブル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を指定した場合に機能するように修正するにはどうすればよいですか?

4

1 に答える 1

0

localhostまたは127.0.0.1を指定すると、localhostからの接続のみが受け入れられ、別のマシンから接続しようとすると拒否されます。WTF ?!

それはまさにそれがすることになっていることです。ループバックインターフェイスであり、外部ホストからは見えない127.0.0.1を指定しました。

代わりに、ローカルホストや127.0.0.1ではなく、実際のマシンのホスト名またはIPアドレスをJavaサーバーに配置すると、他の場所からの接続を受け入れます。ダブルWTF?!

繰り返しますが、まさにそれが起こるはずです。なぜそんなに驚いたのかわかりません。

古い学校の同期サーバーを使用する場合、そのような問題はありません。ローカルホストポートにバインドすると、ローカルマシンと外部マシンの両方からの接続を受け入れます。

そうではありません。あなたの観察は間違っています。

どちらの場合も正しい解決策は、にバインドする0.0.0.0か、nullInetAddressにするか、パラメータを省略することです。これらはすべて、にバインドするのと同じ効果がありINADDR_ANYます。つまり、この場合は、任意のインターフェイスを介した接続を受け入れます。

私はそれがうまくいった場合にあなたがしていたことであることを提案します。

于 2013-01-12T02:24:57.363 に答える