web-dev-qa-db-ja.com

ローカルホストへの接続が拒否されるのはなぜですか?

クライアントマシンが接続するサーバーがあります。最近、stunnelを使用して接続を暗号化することにしました。そのため、クライアントプログラムはサーバーに直接接続するのではなく、localhost:8045に接続します(確認したところ、このポートは使用されていません)。

Javaコード:

URL url = new URL("http://localhost:8045/malibu/GetProviders");
InputStream stream = url.openStream();

そして、私は以下を取得します:

Java.net.ConnectException: Connection refused: connect
    at Java.net.PlainSocketImpl.socketConnect(Native Method)
    at Java.net.PlainSocketImpl.doConnect(PlainSocketImpl.Java:333)
    at Java.net.PlainSocketImpl.connectToAddress(PlainSocketImpl.Java:195)
    at Java.net.PlainSocketImpl.connect(PlainSocketImpl.Java:182)
    at Java.net.SocksSocketImpl.connect(SocksSocketImpl.Java:366)
    at Java.net.Socket.connect(Socket.Java:519)
    at Java.net.Socket.connect(Socket.Java:469)
    at Java.net.Socket.<init>(Socket.Java:366)
    at Java.net.Socket.<init>(Socket.Java:180)
    . . .

curlを使用して同じページをリクエストしようとすると、すべて問題ありません。

何がそのような振る舞いを引き起こす可能性がありますか?

EDIT:はい、リスニングソケットがあります-running netstat -avn | grep 8045与える:

tcp6       0      0 ::1:8045                :::*                    LISTEN
7
Rogach

リスニングソケットは、IPv6ループバックアドレス(:: 1)にバインドされています。 JavaデュアルスタックIPv4/IPv6システムを正しくサポートしていないという問題を思い出します。これはおそらくそのようなケースです。127.0.0.1のみ(IPv4)に接続しています。

他のすべて(curl、telnet ...)は、最初にIPv6アドレスを試行し、失敗した場合はIPv4アドレスにフォールバックします。 Javaアプリケーションは機能しませんが、機能するのはそのためです。

Stunnelを127.0.0.1にバインドしてみてください。 Java http://[::1]:8045/malibu/GetProvidersに接続してみることもできますが、HTTP URLでIPv6アドレスをサポートしているかどうかは思い出せません。

14
cdhowie

WindowsにApacheがあり、Javaからの接続も拒否されました。ただし、接続とApacheログをデバッグすると、実際には接続の問題ではないことがわかります。 Apacheはエラー301を返し、永続的に移動します。次に、存在しないポート8080へのリダイレクトURLを提供します。したがって、サーバー構成に問題があります。おそらくServerNameディレクティブが間違ったポートを使用しています。 要求されたURLに末尾のスラッシュを追加すると、問題が修正されます。私の場合、最も有用なデバッグ出力はwgetによって提供されました。

受け入れられた答え が現象を説明していない可能性があります。記者自身がコメントで、最後にスラッシュ付きのURLを使用したことを認めました。

1
Jarekczek