2

我正在使用 Socket 类建立一个 java TCP 连接。

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

我希望快速建立或根本不建立此连接,因此我使用 50 毫秒作为连接超时。

但如果我测量这些调用之间的时间,我会得到超过 50 毫秒:125 毫秒,甚至 200 毫秒。测量我使用 System.currentMillis() 的时间。我知道这种方法的粒度不是很好,但是+100ms 的差异实在是太荒谬了。

连接方法有问题?超时时间太短了 50 毫秒?我在 Windows 7 中使用 java 1.7.0_03。

4

2 回答 2

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 回答
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 回答