我正在使用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。
答案 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));
}
}
}