58

私は自分でSocketを学ぼうとしています。オラクルのウェブサイトからのテキストをフォローすることで少し混乱しています。それに関していくつか質問があります。明確な説明を事前に感謝します。

setSoTimeout

public void setSoTimeout(int timeout)はSocketExceptionをスローします

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

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

    mySocket.setSoTimeout(2000);
    

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

  3. タイムアウトが期限切れになるとはどういう意味ですか?

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

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

4

3 に答える 3

49

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

いいえ、2000ms以内にデータが到着しない場合、aSocketTimeoutExceptionがスローされることを意味します。

タイムアウトが期限切れになるとはどういう意味ですか?

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

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

「有効にする必要がある」ものはありません。「有効になっている可能性がある」という意味の場合、これはそのうちの1つです。

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

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

于 2013-05-06T12:39:22.770 に答える
37

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

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

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

于 2012-10-10T14:00:58.610 に答える
13

この例は私にすべてを明らかにしました:
あなたが見ることができるように、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();
    }
  }
}
于 2012-10-10T14:37:02.417 に答える