最近,我的項目要求java模擬http請求,獲得dns解決 tcp處理過的信息特定的連接。
java api提供urlConnection apache提供的httpClient都不能勝任該需求,二次開發太費時間。
於是google之。
最后 得出兩種解決的方法:
一是使用HTTP4J。
該開源項目使用socket方式。模擬請求。記錄時間戳,基本滿足需求。對於header自己定義等細節,可在此基礎上比較方便的二次開發。
僅僅是。當中有一些bug須要修復, 如https鏈接時獲取不到ssl時間等。使用該項目的風險在於不穩定和不可控性。
稍作修改后的http4j代碼。
http://download.csdn.net/detail/zhongyuan_1990/8837281
二是使用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(); } } }