8

クライアントマシンが接続するサーバーがあります。最近、接続を 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、すべて問題ありません。

このような動作の原因は何ですか?

編集:はい、リスニングソケットがあります-実行すると次のようになりnetstat -avn | grep 8045ます:

tcp6       0      0 ::1:8045                :::*                    LISTEN
4

2 に答える 2

14

リスニング ソケットは、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 アドレスがサポートされているかどうかは思い出せません。

于 2011-08-28T07:03:26.917 に答える
1

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

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

于 2013-11-25T16:54:24.017 に答える