4

接続コンストラクターで作成されたソケットの接続タイムアウトはどれくらいですか?

Java SE 6では、Socketの次のコンストラクターは、構築後にconnectを呼び出す代わりに、ソケットをすぐに接続します。

  • Socket(InetAddress address, int port)
  • Socket(InetAddress host, int port, boolean stream)
  • Socket(InetAddress address, int port, InetAddress localAddr, int localPort)
  • Socket(String host, int port)
  • Socket(String host, int port, boolean stream)
  • Socket(String host, int port, InetAddress localAddr, int localPort)

new Socket()Java SEの人々がソケットを構築する500の方法を作成したのは便利で便利ですが、500のリストを参照するだけで、(後に呼び出す代わりにSocket#connect())必要なことを実行するものを見つけることができます。これらのコンストラクターのドキュメントには、接続タイムアウトとは何か、またはそれらが呼び出すかどうか/どのように呼び出すかが記載されていますconnect(SocketAddress endpoint, int timeout)

おそらく、コンストラクターのドキュメントで話してcreateSocketImplいることは、タイムアウトについて何かを暗示しているのでしょうか、それとも他の場所でそれを言っているドキュメントがあるのでしょうか?

これらのコンストラクターの実際の接続タイムアウトを知っている人はいますか?


背景:さて、仕様が本当にあいまいであると仮定すると(Javaは移植可能だと思いましたか?)、顧客のコードが一見ランダムな時間にフリーズする理由を理解しようとしています。これらのコンストラクターの1つを呼び出すオープンソースライブラリを呼び出すコードがあります。これらのコンストラクターの1つを呼び出すと、タイムアウトが無限になるのか、それとも非常に長くなるのかを知りたいです。お客様が使用しているJDKのバージョンがわからないので、仕様にタイムアウトがどこかに記載されていると便利です。おそらく顧客からJDKバージョンを入手できると思いますが、おそらくクローズドソースのJDKになるでしょう。その場合、SEライブラリのバージョンのコードをリバースエンジニアリングして調べることができますか?難しい?刑務所に行きますか?

4

6 に答える 6

3

Javaのドキュメントにはタイムアウトは無限であると記載されていますが、実際には、JVMが接続操作にタイムアウトを課さないことを意味しますが、OSはソケット操作にタイムアウト設定を自由に課すことができます。

したがって、実際のタイムアウトは、OSのTCP/IPレイヤー設定によって異なります。

プログラミングの良い習慣は、すべてのソケット操作のタイムアウトを設定することです。できれば、構成ファイルを介して構成できます。構成可能にすることの利点は、展開環境のネットワーク負荷に応じて、ソフトウェア全体を再構築/再テスト/再リリースせずにタイムアウトを調整できることです。

于 2012-10-19T15:37:03.563 に答える
3

Javaの仕様は偽物です。これらのコンストラクターのタイムアウトは何であるかは示されていないため、実装はタイムアウトを0.000000000001ナノ秒に設定しても、正しい可能性があります。さらに、非有限のタイムアウトはvmの実装によっても尊重されないため(ここに表示されているように)、仕様は問題ではないように見えます。

結論:顧客のJVMのクローズドソースバイナリ(おそらく違法ですが、やらなければならないことをしなければなりません)とOSソケットドキュメントを読む必要があります。

于 2012-10-19T16:28:28.207 に答える
2

を見ると、code of Socket in OpenJDK 6-b14これらのコンストラクターがを呼び出すことがわかりconnect(socketAddress, 0)ます。これは、無限のタイムアウト値を意味します。

于 2012-10-19T14:52:50.760 に答える
2

ソースによると(ここでは1.5_13を見ていますが、違いはないはずです)、さまざまなSocketコンストラクターはすべて次のようSocket(SocketAddress, SocketAddress, boolean)に定義されています。

private Socket(SocketAddress address, SocketAddress localAddr,
           boolean stream) throws IOException {
    setImpl();

    // backward compatibility
    if (address == null)
        throw new NullPointerException();

    try {
        createImpl(stream);
        if (localAddr == null)
        localAddr = new InetSocketAddress(0);
        bind(localAddr);
        if (address != null)
        connect(address);
    } catch (IOException e) {
        close();
        throw e;
    }
}

connect(SocketAddress)と定義されている

public void connect(SocketAddress endpoint) throws IOException {
    connect(endpoint, 0);
}

したがって、無限のタイムアウト(@Keppilがすでに述べたように)。

于 2012-10-19T15:00:43.313 に答える
1

SocketクラスはJava1.0以降に存在しますが、当時はソケットを作成することしかできず、すぐに接続され、接続タイムアウトを指定することはできませんでした。Java 1.4以降、接続されていないソケットを作成し、connectメソッドを使用してタイムアウトを指定することが可能になりました。誰かが「古い」コンストラクターのドキュメントを明確にするのを単に忘れて、明示的なタイムアウトなしでこれらがまだ動作することを指定していると思います。

タイムアウトパラメータを使用した接続メソッドのドキュメントには、「ゼロのタイムアウトは無限のタイムアウトとして解釈される」と記載されています。これは、Java VMによってタイムアウトが暗黙指定されていないことを意味するだけなので、実際には正しくありません。タイムアウトが0の場合でも、接続操作はオペレーティングシステムのTCP/IPスタックでタイムアウトする可能性があります。

于 2012-10-19T15:44:41.217 に答える
1

プラットフォームに依存しますが、約1分です。connect()のJavadocは、無限であると述べている点で正しくありません。また、connect()タイムアウトパラメータは、デフォルトを増やすためではなく、減らすためにのみ使用できることにも注意してください。

于 2012-10-19T20:58:45.100 に答える