web-dev-qa-db-ja.com

setSoTimeoutの機能とその機能は何ですか?

私は自分でSocketを学ぼうとしています。 OracleのWebサイトからのテキストに従うことで、少し混乱しています。それに関していくつか質問があります。明確な説明を事前に感謝します。

setSoTimeout

public void setSoTimeout(int timeout)throws SocketException

指定されたタイムアウト(ミリ秒単位)でSO_TIMEOUTを有効/無効にします。このオプションをゼロ以外のタイムアウトに設定すると、このSocketに関連付けられたInputStreamに対するread()呼び出しは、この時間だけブロックされます。タイムアウトが期限切れになると、Java.net.SocketTimeoutExceptionが発生しますが、ソケットはまだ有効です。このオプションは、ブロック操作に入る前に有効にする必要があります。タイムアウトは0より大きい必要があります。ゼロのタイムアウトは、無限タイムアウトとして解釈されます。

  1. SO_TIMEOUTとは何ですか?
  2. ソケットは接続のエンドポイントです。私が言うなら

    mySocket.setSoTimeout(2000);
    

    このソケットのサーバー/クライアントからの入力を2000ミリ秒間ブロックし、この時間後にソケットがデータを読み取る準備ができていることをブロックしていますか?

  3. タイムアウトの期限はどういう意味ですか?

  4. 操作をブロックする前に有効にする必要があるオプションは何ですか?

  5. 無限タイムアウトは、ソケットがもう読み取らないことを意味しますか?

45
Bernard

JavaDoc は非常によく説明しています:

このオプションをゼロ以外のタイムアウトに設定すると、このソケットに関連付けられたInputStreamでのread()呼び出しは、この時間だけブロックされます。タイムアウトが期限切れになると、Java.net.SocketTimeoutExceptionが発生しますが、ソケットはまだ有効です。このオプションは、ブロック操作に入る前に有効にする必要があります。タイムアウトは0より大きい必要があります。ゼロのタイムアウトは、無限タイムアウトとして解釈されます。

_SO_TIMEOUT_は、read()呼び出しがブロックするタイムアウトです。タイムアウトに達すると、 Java.net.SocketTimeoutException がスローされます。永久にブロックしたい場合、このオプションをゼロ(デフォルト値)にすると、read()呼び出しは、少なくとも1バイトが読み取られるまでブロックされます。

30
logoff

このソケットのサーバー/クライアントからの入力を2000ミリ秒間ブロックし、この時間後にソケットがデータを読み取る準備ができていることを意味していますか?

いいえ、2000ミリ秒以内にデータが到着しない場合、SocketTimeoutExceptionがスローされます。

タイムアウトの期限はどういう意味ですか?

これは、データが到着せずに2000ms(あなたの場合)が経過することを意味します。

操作をブロックする前に有効にする必要があるオプションは何ですか?

有効にする必要のあるものはありません。 「有効にすることができる」という意味であれば、これはその1つです。

ソケットがもう読み取らないという無限タイムアウトのメナス?

なんて奇妙な提案。これは、データが到着しない場合、読み取りを永久にブロックすることを意味します。

35
user207421

この例により、すべてが明確になりました。
ご覧のとおり、setSoTimeoutはプログラムのハングを防ぎます。 SO_TIMEOUT時間待機します!シグナルを受け取らない場合、例外をスローします!それは時間が経過したことを意味します!

import Java.io.IOException;
import Java.net.ServerSocket;
import Java.net.Socket;
import Java.net.SocketTimeoutException;

public class SocketTest extends Thread {
  private ServerSocket serverSocket;

  public SocketTest() throws IOException {
    serverSocket = new ServerSocket(8008);
    serverSocket.setSoTimeout(10000);
  }

  public void run() {
    while (true) {
      try {
        System.out.println("Waiting for client on port " + serverSocket.getLocalPort() + "...");
        Socket client = serverSocket.accept();

        System.out.println("Just connected to " + client.getRemoteSocketAddress());
        client.close();
      } catch (SocketTimeoutException s) {
        System.out.println("Socket timed out!");
        break;
      } catch (IOException e) {
        e.printStackTrace();
        break;
      }
    }
  }

  public static void main(String[] args) {
    try {
      Thread t = new SocketTest();
      t.start();
    } catch (IOException e) {
      e.printStackTrace();
    }
  }
}
12
Bernard