Java 使用套接字建立连接。使用超时连接
我正在使用Socket类建立java TCP连接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 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));
}
}
}