クライアントマシンが接続するサーバーがあります。最近、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
リスニングソケットは、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アドレスをサポートしているかどうかは思い出せません。
WindowsにApacheがあり、Javaからの接続も拒否されました。ただし、接続とApacheログをデバッグすると、実際には接続の問題ではないことがわかります。 Apacheはエラー301を返し、永続的に移動します。次に、存在しないポート8080へのリダイレクトURLを提供します。したがって、サーバー構成に問題があります。おそらくServerNameディレクティブが間違ったポートを使用しています。 要求されたURLに末尾のスラッシュを追加すると、問題が修正されます。私の場合、最も有用なデバッグ出力はwgetによって提供されました。
受け入れられた答え が現象を説明していない可能性があります。記者自身がコメントで、最後にスラッシュ付きのURLを使用したことを認めました。