最近,我的項目要求java模擬http請求,獲得dns解決 tcp處理過的信息特定的連接。
java api提供urlConnection apache提供的httpClient都不能勝任該需求,二次開發太費時間。
于是google之。
最后 得出兩種解決的方法:
一是使用HTTP4J。
該開源項目使用socket方式。模擬請求。記錄時間戳,基本滿足需求。對于header自己定義等細節,可在此基礎上比較方便的二次開發。
僅僅是。當中有一些bug須要修復,如https鏈接時獲取不到ssl時間等。使用該項目的風險在于不穩定和不可控性。
稍作修改后的http4j代碼。
二是使用curl。
google之,curl本身沒有對java的支持。由第三份提供了binding用來使用curl。可能是筆者能力有限,未能成功在windows編譯它。
google也沒有找到相關javacurl.dll的資源下載。
最后不得不放棄。選擇使用命令行的模式操作curl。
java 使用curl命令 demo
package com.netbirdtech.libcurl.test;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class test {
public static void main(String[] args) {
String []cmds = {"curl", "-i", "-w", "狀態%{http_code};DNS時間%{time_namelookup};"
+ "等待時間%{time_pretransfer}TCP 連接%{time_connect};發出請求%{time_starttransfer};"
+ "總時間%{time_total}","http://www.baidu.com"};
ProcessBuilder pb=new ProcessBuilder(cmds);
pb.redirectErrorStream(true);
Process p;
try {
p = pb.start();
BufferedReader br=null;
String line=null;
br=new BufferedReader(new InputStreamReader(p.getInputStream()));
while((line=br.readLine())!=null){
System.out.println("\t"+line);
}
br.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}