最近,我的项目要求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(); } } }