使用超时与Socket.connect建立连接

时间:2013-02-08 16:47:40

标签: java sockets connection timeout

我正在使用Socket类进行java TCP连接。

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

我希望快速建立此连接或根本不建立此连接,因此我使用50 ms进行连接超时。

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

connect方法有问题吗?超时的时间是50毫秒太少了?我在Windows 7中使用java 1.7.0_03。

2 个答案:

答案 0 :(得分: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。

答案 1 :(得分:0)

扩展tdn120的answer我最后移动了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));
        }
    }
}