我正在编写一个Java程序来计算http连接时间(假设)5 http连接(到不同的IP)。
第一个场景是,没有线程,程序逐个连接和测试http服务器,这意味着完成一个服务器测试然后进入另一个服务器。在这种情况下,所花费的时间非常长。此外,超时工作不正常,例如,我已设置
setConnectTimeout(5 * 1000);
setReadTimeout(5 * 1000);
但时间返回
long starTime = System.currentTimeMillis();
c.connect();
String line;
BufferedReader in = new BufferedReader(new InputStreamReader(uc.getInputStream()));
while ((line = in.readLine()) != null){
page.append(line);
elapseTime = System.currentTimeMillis() - starTime;
可以超过5秒,有些甚至高达30秒(但我只设置5秒作为超时)。
因此,我将实现变为多线程。但结果更加荒谬。我现在甚至无法获得一个成功的连接。
现在我的问题是,我们可以使用多个线程建立多个连接吗?如果答案是肯定的,我必须注意避免上述问题?
感谢。
* 额外信息 * 1)我正在计算代理连接速度,所以,ya,连接是代理连接。 2)我创建的线程大约为100.我认为应该没问题吗?
答案 0 :(得分:0)
你是如何建立联系的?你在使用套接字连接吗?如果是这样,根据您设置套接字的方式,您可能会发现连接超时值可能会被忽略
Socket sock = new Socket("hostname", port);
sock.setSoTimeout(5000);
sock.connect();
实际上不会设置连接超时值,因为构造函数已经尝试连接。
SocketAddress sockaddr = new InetSocketAddress(host, port);
Socket sock = new Socket();
sock.connect(sockaddr, 5000);
更准确地连接超时值。这可以解释为什么套接字超时不起作用。
答案 1 :(得分:0)
public float getConnectionTime(){
long elapseTime = 0;
Proxy proxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress(ipAdd, portNum));
URL url;
StringBuilder page = new StringBuilder();
HttpURLConnection uc = null;
try {
uc = (HttpURLConnection)Main.targetMachine.openConnection(proxy);
// uc = (HttpURLConnection)Main.targetMachine.openConnection();
uc.setConnectTimeout(Main.timeOut);
uc.setReadTimeout(Main.timeOut);
long starTime = System.currentTimeMillis();
uc.connect();
// if (uc.getResponseCode() == HttpURLConnection.HTTP_OK){
// System.out.println("55555");
// }else System.out.println("88888");
String line;
BufferedReader in = new BufferedReader(new InputStreamReader(uc.getInputStream()));
while ((line = in.readLine()) != null){
page.append(line);
elapseTime = System.currentTimeMillis() - starTime;
}
} catch (SocketTimeoutException e) {
System.out.println("time out lo");
// e.printStackTrace();
return 9999; //if time out, use 9999 signal.
} catch (IOException e){
System.out.println("open connection error, connect error or inputstream error");
// e.printStackTrace();
return 9999;
}finally{
if (uc != null)
uc.disconnect();
}
// System.out.println(page);
return (float)elapseTime / 1000;
}