Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用套接字建立连接。使用超时连接_Java_Sockets_Connection_Timeout - Fatal编程技术网

Java 使用套接字建立连接。使用超时连接

Java 使用套接字建立连接。使用超时连接,java,sockets,connection,timeout,Java,Sockets,Connection,Timeout,我正在使用Socket类建立java TCP连接 Socket socket = new Socket(); socket.connect(new InetSocketAddress(host,port),50); 我希望快速建立连接,或者根本不建立连接,所以我使用50毫秒作为连接超时时间 但如果我测量两次通话之间的时间,我会得到50毫秒以上:125毫秒,甚至200毫秒。来测量我使用System.currentMillis()的时间。我知道这种方法的粒度不是很好,但是+100ms的差异太荒谬了

我正在使用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\u 03。

我感觉这与您如何计时有关。您需要确保正在记录执行前后的时间

虽然我使用的是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的版本。

在tdn120的基础上扩展,我将
println
移到了finally。我不断地发现,如果没有对实现的详细了解,我不确定这是否应该负责。底层操作系统也可能使用某个最小值或粒度作为超时值。还要考虑从主机名解析IP地址所需的时间;这不是AFAIK连接超时的一部分。您是否测量成功或失败的连接?也可能只有第一次连接尝试需要很长时间。试着在一个100个连接的循环中测量它。50毫秒对于网络超时来说是不合理的短。使用一个真实的值,比如几秒钟。我正在测量成功和失败的连接,在一个超过100个连接的循环中,所用的时间不一致(62,55,67251104…)。我使用的主机是“xxx.xxx.xxx.xxx”格式的,因此我认为不涉及任何ip解析。奇怪的是,当我使用我的专用网络“192.168.1.x”中的主机时,不一致的超时并没有出现。我正在精确地测量时间(但使用currentMillis而不是nanoTime)。事实上,当我从我的私人网络使用主机时,我得到50和51,但当我使用外部IP时,我没有得到。是的,但这是我没有得到的。在你的例子中,你得到一个63和一个2350。为什么呢?我的意思是,你告诉这个方法你不想等待超过50毫秒,所以为什么它需要更长的时间。最多2350!可能传递给connect方法的超时只是一种建议……我希望您能注意到额外的时间。50毫秒是套接字连接超时。当我使用一个名称而不是I/p,特别是一个无效的名称(abcd.com)时,dns失败会花费更多的时间。在执行socket.close()操作后,我在finally子句中测量了总时间。这似乎需要很多时间:(
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));
        }
    }
}