2

Socket クラスを使用して Java TCP 接続を作成しています。

Socket socket = new Socket();
socket.connect(new InetSocketAddress(host,port),50);

この接続を高速に確立するか、まったく確立しないようにしたいので、接続タイムアウトに 50 ミリ秒を使用しています。

しかし、これらの呼び出しの間の時間を測定すると、50 ミリ秒以上 (125 ミリ秒、さらには 200 ミリ秒) が得られます。時間を測定するには、System.currentMillis() を使用しています。この方法の粒度があまり良くないことは知っていますが、+100ミリ秒の不一致はばかげています。

接続方法に問題がありますか?50 ミリ秒ではタイムアウト時間が短すぎますか? Windows 7 で Java 1.7.0_03 を使用しています。

4

2 に答える 2

0

tdn120 の回答を拡張して、最終的に移動しprintlnました。私は一貫して100未満です。私も Windows 7、Java 7 (1.7.0) を実行しています。

javac -g SocketTest.java && java SocketTest localhost:80 abcd.com:80 localhost:80 localhost:80 localhost:80 
Testing: localhost:80
java.net.SocketTimeoutException: connect timed out
Time: 63
Testing: abcd.com:80
java.net.UnknownHostException: abcd.com
Time: 2350
Testing: localhost:80
java.net.SocketTimeoutException: connect timed out
Time: 50
Testing: localhost:80
java.net.SocketTimeoutException: connect timed out
Time: 50
Testing: localhost:80
java.net.SocketTimeoutException: connect timed out
Time: 50

私のコードは次のとおりです。

import java.net.*;

public class SocketTest {
    public static void main(String[] args) throws Exception {
        if (args.length == 0) {
            args = new String[]{"localhost:80"};
        }
        for (String target: args) {
            test(target);
        }
    }

    private static void test(String target) throws Exception {
        System.out.println("Testing: " + target);
        String[] parts = target.split(":");
        String host = parts[0];
        int port = Integer.valueOf(parts[1]);
        Socket socket = new Socket();
        long start = 0;
        try {
            start = System.nanoTime();
            socket.connect(new InetSocketAddress(host, port), 50);
        } catch (Exception e) {
            System.out.println(e.toString());
        } finally {
            long end = System.nanoTime();
            System.out.println("Time: " + ((end - start) / 1000000));
        }
    }
}
于 2013-02-08T19:08:31.410 に答える
0

タイミングの取り方が関係しているような気がします。実行の直前と直後の時間を記録していることを確認する必要があります。

Linux を使用していますが、次のコードで一貫して 51 または 52 の結果が得られます。

public class SocketTest {
    public static void main(final String[] args) throws IOException {
        Socket socket = new Socket();
        long start = 0;
        try {
            start = System.nanoTime();
            socket.connect(new InetSocketAddress("192.168.1.100", 80), 50);
        } catch (SocketTimeoutException e) {
            long end = System.nanoTime();
            System.out.println("Time: " + ((end - start) / 1000000));
        }
    }
}

更新: Windows 7 で試しましたが、50 年代と 51 年代になりました。

于 2013-02-08T18:43:18.250 に答える