我看了基本知道了点。
分享给楼主。你给的那个网址很有用。
    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

解决方案 »

  1.   

    你给代码里 MyLineParser  好像没有用上。
      

  2.   


    我没用过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);
    你试试看。 
      

  3.   

    还是相同的错误。org.apache.http.client.ClientProtocolException
    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
      

  4.   


       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());
                }
            }
        }加断点调试发现,这个类里面的代码没有执行
      

  5.   

    1)我用的4.2.1httpClient
    2)你调用地方真的按下面的改了吗?ClientConnectionManager cm = new MyBasicClientConnectionManager();
    DefaultHttpClient hc = new DefaultHttpClient(cm);
    HttpResponse response = hc.execute(httpGet);
    我本地是能用的。
      

  6.   

    你的HttpResponse response = new DefaultHttpClient().execute(httpGet);
    要改成ClientConnectionManager cm = new MyBasicClientConnectionManager();
    DefaultHttpClient hc = new DefaultHttpClient(cm);
    HttpResponse response = hc.execute(httpGet);
    3句。这样改你对不对我不能确认,但我本地执行能走到MyLineParser#parseHeader方法里。
      

  7.   


    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了,并没有走异常处理的部分。
      

  8.   

    你的httpClient是最新的吗? 4.2.1?
      

  9.   

    MyBasicClientConnectionManager 我改了下,应该应该可以了把~~麻烦再试下看看。
    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();
    }
    }}
      

  10.   


    别光顶哦~~ #13楼的试过没??
    如果还有问题,想想return new BasicHttpResponse(new BasicStatusLine(HttpVersion.HTTP_1_1, 200, ""));这句怎么改。
      

  11.   

    没有异常了,但是读不到数据了,正确的url也读不到数据了, 
    使用  url1 = "http://192.168.1.83/imonitorint.html?op=r&33032=0";的时候也没有进去MyLineParser#parseHeader的异常处理。
      

  12.   


    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
      

  13.   

    版本一样,我刚下载的,也是4.2.1
    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
      

  14.   

    以下是我的观点:光屏蔽解析head的代码错误应该是没有用的。对于内容的读取,返回head的内容至关重要。httpclient组件获取返回内容,需要head里面的至少这几个项目
    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的代码不好下结论。
      

  15.   

    public static void main(String[] args) {
    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来试的。
    能打出来东西。 
      

  16.   

    http://dl.iteye.com/topics/download/1f849e26-6132-3ce6-9e47-ba4cb18ed88f
    我写的测试工程,您有空下载下来,试试看吧。
      

  17.   

    http://goro.iteye.com/admin/blogs/1636275
    iteye的地址,下载也许需要注册。 不好意思。
      

  18.   


    如果楼主下载了这个,运行了我的程序能取得baidu的返回值。
    就试试看把url改成你的url试试看。 如果也能取到。
    那么我猜是jar的问题,也许你用了不少jar。而有些jar里包含了httpClient或httpCore的旧的类。
    试试把我给你的下载的最新的httpclient和httpcore加到buildpath里被设在最前面,再试试你的工程。
      

  19.   

    http://192.168.1.83/imonitorint.html?op=r&33032=0
    这个地址用浏览器访问正常吗?
      

  20.   

    没有解决问题,不清楚是代码没写好,还是服务端的问题。感谢 scbb 问答这么多次。
      

  21.   

    这个问题可能是bug,使用4.1和4.3的版本没有这个问题,使用4.2.1版本有这个问题。
    我测试的结果是这样的。