我看了基本知道了点。
分享给楼主。你给的那个网址很有用。
class MyClientConnManager extends SingleClientConnManager {
public MyClientConnManager(
final HttpParams params,
final SchemeRegistry sr) {
super(params, sr);
}
@Override
protected ClientConnectionOperator createConnectionOperator(
final SchemeRegistry sr) {
return new MyClientConnectionOperator(sr);
}
}上面的SingleClientConnManager 已经被不推荐了。
可以换成
BasicClientConnectionManager, PoolingClientConnectionManager, ThreadSafeClientConnManager
的其中一个吧。我都没试过。如果用BasicClientConnectionManager 这个继承的话。
构造函数是可以没有参数的。
那么你在ClientConnectionManager cm = new MyBasicClientConnectionManager()
DefaultHttpClient hc = new DefaultHttpClient(cm);
HttpResponse response = hc.execute(httpGet);
当然最最重要的是,在你那个网址里 class MyLineParser extends BasicLineParser {
@Override
public Header parseHeader(
final CharArrayBuffer buffer) throws ParseException {
try {
return super.parseHeader(buffer);
} catch (ParseException ex) {
// 压制ParseException异常
return new BasicHeader("invalid", buffer.toString());
}
}
}
抓到例外后把它怎么忽略了。
用原版的httpClient库就是
super.parseHeader(buffer);这里发生了ProtocolException
分享给楼主。你给的那个网址很有用。
class MyClientConnManager extends SingleClientConnManager {
public MyClientConnManager(
final HttpParams params,
final SchemeRegistry sr) {
super(params, sr);
}
@Override
protected ClientConnectionOperator createConnectionOperator(
final SchemeRegistry sr) {
return new MyClientConnectionOperator(sr);
}
}上面的SingleClientConnManager 已经被不推荐了。
可以换成
BasicClientConnectionManager, PoolingClientConnectionManager, ThreadSafeClientConnManager
的其中一个吧。我都没试过。如果用BasicClientConnectionManager 这个继承的话。
构造函数是可以没有参数的。
那么你在ClientConnectionManager cm = new MyBasicClientConnectionManager()
DefaultHttpClient hc = new DefaultHttpClient(cm);
HttpResponse response = hc.execute(httpGet);
当然最最重要的是,在你那个网址里 class MyLineParser extends BasicLineParser {
@Override
public Header parseHeader(
final CharArrayBuffer buffer) throws ParseException {
try {
return super.parseHeader(buffer);
} catch (ParseException ex) {
// 压制ParseException异常
return new BasicHeader("invalid", buffer.toString());
}
}
}
抓到例外后把它怎么忽略了。
用原版的httpClient库就是
super.parseHeader(buffer);这里发生了ProtocolException
我没用过HttpClient。 只是这里问得比较多。
我都没有运行过,就下了几个jar在瞎捣鼓。MyBasicClientConnectionManager代码package sh.pl;import org.apache.http.Header;
import org.apache.http.HttpResponseFactory;
import org.apache.http.conn.ClientConnectionOperator;
import org.apache.http.conn.OperatedClientConnection;
import org.apache.http.conn.scheme.SchemeRegistry;
import org.apache.http.impl.conn.BasicClientConnectionManager;
import org.apache.http.impl.conn.DefaultClientConnection;
import org.apache.http.impl.conn.DefaultClientConnectionOperator;
import org.apache.http.impl.conn.DefaultHttpResponseParser;
import org.apache.http.io.HttpMessageParser;
import org.apache.http.io.SessionInputBuffer;
import org.apache.http.message.BasicHeader;
import org.apache.http.message.BasicLineParser;
import org.apache.http.params.HttpParams;
import org.apache.http.util.CharArrayBuffer;public class MyBasicClientConnectionManager extends
BasicClientConnectionManager { public MyBasicClientConnectionManager() {
super();
} @Override
protected ClientConnectionOperator createConnectionOperator(
final SchemeRegistry sr) {
return new MyClientConnectionOperator(sr);
} class MyLineParser extends BasicLineParser {
@Override
public Header parseHeader(final CharArrayBuffer buffer) {
try {
return super.parseHeader(buffer);
} catch (Exception ex) {
// 压制ParseException异常
return new BasicHeader("invalid", buffer.toString());
}
}
} class MyClientConnection extends DefaultClientConnection {
@Override
protected HttpMessageParser createResponseParser(
final SessionInputBuffer buffer,
final HttpResponseFactory responseFactory,
final HttpParams params) {
return new DefaultHttpResponseParser(buffer, new MyLineParser(),
responseFactory, params);
}
} class MyClientConnectionOperator extends DefaultClientConnectionOperator {
public MyClientConnectionOperator(final SchemeRegistry sr) {
super(sr);
} @Override
public OperatedClientConnection createConnection() {
return new MyClientConnection();
}
}}使用 ClientConnectionManager cm = new MyBasicClientConnectionManager();
DefaultHttpClient hc = new DefaultHttpClient(cm);
HttpResponse response = hc.execute(httpGet);
你试试看。
at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:909)
at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:805)
at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:784)
at HttpAgreement.getResultByHttpGet1(HttpAgreement.java:71)
at HttpAgreement.main(HttpAgreement.java:115)
Caused by: org.apache.http.ProtocolException: The server failed to respond with a valid HTTP response
at org.apache.http.impl.conn.DefaultHttpResponseParser.parseHead(DefaultHttpResponseParser.java:103)
at org.apache.http.impl.conn.DefaultHttpResponseParser.parseHead(DefaultHttpResponseParser.java:62)
at org.apache.http.impl.io.AbstractMessageParser.parse(AbstractMessageParser.java:254)
at org.apache.http.impl.AbstractHttpClientConnection.receiveResponseHeader(AbstractHttpClientConnection.java:289)
at org.apache.http.impl.conn.DefaultClientConnection.receiveResponseHeader(DefaultClientConnection.java:252)
at org.apache.http.impl.conn.ManagedClientConnectionImpl.receiveResponseHeader(ManagedClientConnectionImpl.java:191)
at org.apache.http.protocol.HttpRequestExecutor.doReceiveResponse(HttpRequestExecutor.java:300)
at org.apache.http.protocol.HttpRequestExecutor.execute(HttpRequestExecutor.java:127)
at org.apache.http.impl.client.DefaultRequestDirector.tryExecute(DefaultRequestDirector.java:712)
at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:517)
at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:906)
... 4 more
class MyLineParser extends BasicLineParser {
@Override
public Header parseHeader(final CharArrayBuffer buffer) {
try {
//这行代码没有执行
return super.parseHeader(buffer);
} catch (Exception ex) {
// 压制ParseException异常 也这行代码没有执行
return new BasicHeader("invalid", buffer.toString());
}
}
}加断点调试发现,这个类里面的代码没有执行
2)你调用地方真的按下面的改了吗?ClientConnectionManager cm = new MyBasicClientConnectionManager();
DefaultHttpClient hc = new DefaultHttpClient(cm);
HttpResponse response = hc.execute(httpGet);
我本地是能用的。
要改成ClientConnectionManager cm = new MyBasicClientConnectionManager();
DefaultHttpClient hc = new DefaultHttpClient(cm);
HttpResponse response = hc.execute(httpGet);
3句。这样改你对不对我不能确认,但我本地执行能走到MyLineParser#parseHeader方法里。
public static String getResultByHttpGet1(String url)
throws ClientProtocolException, IOException
{
try
{
SingleClientConnManager sccm =new SingleClientConnManager();
String result = "";
url1 = "http://192.168.1.83/imonitorint.html?op=r&33032=0";
//url2="http://192.168.1.5/web/getwinoptions.php?opt=0.24,&ts=324532589789789767jk";
HttpGet httpGet = new HttpGet(url1);
ClientConnectionManager cm = new MyBasicClientConnectionManager();
DefaultHttpClient hc = new DefaultHttpClient(cm);
HttpResponse response = hc.execute(httpGet);
return result;
} catch (Exception err)
{
err.printStackTrace();
}
return "";
}代码肯定改过来了,我试了可以正确获取数据的url,是可以进去MyLineParser#parseHeader的,走的是正确的情况,但是使用 出错的url的时候,根本就没有进去MyLineParser#parseHeader了,并没有走异常处理的部分。
package sh.pl;import java.io.IOException;import org.apache.http.Header;
import org.apache.http.HttpException;
import org.apache.http.HttpResponse;
import org.apache.http.HttpResponseFactory;
import org.apache.http.HttpVersion;
import org.apache.http.conn.ClientConnectionOperator;
import org.apache.http.conn.OperatedClientConnection;
import org.apache.http.conn.scheme.SchemeRegistry;
import org.apache.http.impl.conn.BasicClientConnectionManager;
import org.apache.http.impl.conn.DefaultClientConnection;
import org.apache.http.impl.conn.DefaultClientConnectionOperator;
import org.apache.http.impl.conn.DefaultHttpResponseParser;
import org.apache.http.io.HttpMessageParser;
import org.apache.http.io.SessionInputBuffer;
import org.apache.http.message.BasicHeader;
import org.apache.http.message.BasicHttpResponse;
import org.apache.http.message.BasicLineParser;
import org.apache.http.message.BasicStatusLine;
import org.apache.http.message.LineParser;
import org.apache.http.params.HttpParams;
import org.apache.http.util.CharArrayBuffer;public class MyBasicClientConnectionManager extends
BasicClientConnectionManager { public MyBasicClientConnectionManager() {
super();
} @Override
protected ClientConnectionOperator createConnectionOperator(
final SchemeRegistry sr) {
return new MyClientConnectionOperator(sr);
} class MyLineParser extends BasicLineParser {
@Override
public Header parseHeader(final CharArrayBuffer buffer) {
try {
return super.parseHeader(buffer);
} catch (Exception ex) {
// 压制ParseException异常
return new BasicHeader("invalid", buffer.toString());
}
}
} class MyClientConnection extends DefaultClientConnection {
@Override
protected HttpMessageParser createResponseParser(
final SessionInputBuffer buffer,
final HttpResponseFactory responseFactory,
final HttpParams params) {
return new MyDefaultHttpResponseParser(buffer, new MyLineParser(),
responseFactory, params);
}
} class MyDefaultHttpResponseParser extends DefaultHttpResponseParser {
public MyDefaultHttpResponseParser(SessionInputBuffer buffer,
LineParser parser, HttpResponseFactory responseFactory,
HttpParams params) {
super(buffer, parser, responseFactory, params);
}
@Override
protected HttpResponse parseHead(
final SessionInputBuffer sessionBuffer) throws IOException, HttpException {
try {
return super.parseHead(sessionBuffer);
} catch (Exception ex) {
// 压制ParseException异常
return new BasicHttpResponse(new BasicStatusLine(HttpVersion.HTTP_1_1, 200, ""));
}
}
} class MyClientConnectionOperator extends DefaultClientConnectionOperator {
public MyClientConnectionOperator(final SchemeRegistry sr) {
super(sr);
} @Override
public OperatedClientConnection createConnection() {
return new MyClientConnection();
}
}}
别光顶哦~~ #13楼的试过没??
如果还有问题,想想return new BasicHttpResponse(new BasicStatusLine(HttpVersion.HTTP_1_1, 200, ""));这句怎么改。
使用 url1 = "http://192.168.1.83/imonitorint.html?op=r&33032=0";的时候也没有进去MyLineParser#parseHeader的异常处理。
MyDefaultHttpResponseParser#parseHead 进了嘛?
还有我担心你和我用的httpclient版本不一样。
我用的是4.2.1。httpclient最新版
http://mirror.bit.edu.cn/apache//httpcomponents/httpclient/binary/httpcomponents-client-4.2.1-osgi-bin.ziphttpcore最新版
http://mirror.bit.edu.cn/apache//httpcomponents/httpcore/binary/httpcomponents-core-4.2.1-osgi-bin.zip
httpcore最新版 这个没有用到,就没有下载
使用url2="http://192.168.1.5/web/getwinoptions.php?opt=0.24,&ts=324532589789789767jk";
的时候一起可以正确获取数据,可以进去MyDefaultHttpResponseParser#parseHead ,现在也可以进去MyDefaultHttpResponseParser#parseHead ,但是最终的返回结果是空。 使用 url1 = "http://192.168.1.83/imonitorint.html?op=r&33032=0";以前有异常,现在没有异常了,但是结果是空,没有进去 进去MyDefaultHttpResponseParser#parseHead
1) HTTP/1.1 200 OK 状态码2) Content-Length: 56008 长度
当然也可以是非固定长度的内容
2) Transfer-Encoding: chunked3) Content-Type: text/html; charset=utf-8 标记内容格式我们想想,连最起码的状态码/长度/格式都没提交给httpclient。它怎么去解析response。
当然也许存在可能跳过这些,得到原始的response stream。没仔细去分析httpclient的代码不好下结论。
String result = "";
String url="http://www.baidu.com/";
HttpGet httpGet = new HttpGet(url);
//执行这行代码时出错
ClientConnectionManager cm = new MyBasicClientConnectionManager();
DefaultHttpClient hc = new DefaultHttpClient(cm);
HttpResponse response;
try {
response = hc.execute(httpGet);
if (response.getStatusLine().getStatusCode() == 200){
HttpEntity entity = response.getEntity();
result = EntityUtils.toString(entity, "GB2312");
}
System.out.println(result);
} catch (ClientProtocolException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
我用baidu来试的。
能打出来东西。
我写的测试工程,您有空下载下来,试试看吧。
iteye的地址,下载也许需要注册。 不好意思。
如果楼主下载了这个,运行了我的程序能取得baidu的返回值。
就试试看把url改成你的url试试看。 如果也能取到。
那么我猜是jar的问题,也许你用了不少jar。而有些jar里包含了httpClient或httpCore的旧的类。
试试把我给你的下载的最新的httpclient和httpcore加到buildpath里被设在最前面,再试试你的工程。
这个地址用浏览器访问正常吗?
我测试的结果是这样的。