在学Android,我通过org.apache.http 和 SAX 请求服务器并解析一个返回的xml。
比如返回以下一个XML,我通过一个url参数count控制返回review的数量<?xml version="1.0" encoding="UTF-8"?>
<reviews>
<review>
<timestamp_id>动态记录Id</timestamp_id>
<created_at>创建时间</created_at>
<id>评论ID</id>
<content>内容</content>
<img>用户拍摄的图片</img>
<type>评论类型(0为详细评论,1为简评,2为签到)</type>
<user>
<id>用户ID</id>
<name>用户名</name>
<face_pic>头像地址</face_pic>
</user>
<product>
<id>产品ID</id>
<name>产品名称</name>
<img>产品图片</img>
</product>
</review>
                        <review>
<timestamp_id>动态记录Id</timestamp_id>
<created_at>创建时间</created_at>
<id>评论ID</id>
<content>内容</content>
<img>用户拍摄的图片</img>
<type>评论类型(0为详细评论,1为简评,2为签到)</type>
<user>
<id>用户ID</id>
<name>用户名</name>
<face_pic>头像地址</face_pic>
</user>
<product>
<id>产品ID</id>
<name>产品名称</name>
<img>产品图片</img>
</product>
</review>
....
</reviews>但是当count<= 9时能够正常返回,大于9时会报错误,如下
java.net.SocketException: socket closed
at java.net.SocketInputStream.socketRead0(Native Method)
at java.net.SocketInputStream.read(Unknown Source)
at org.apache.http.impl.io.AbstractSessionInputBuffer.read(AbstractSessionInputBuffer.java:187)
at org.apache.http.impl.io.ContentLengthInputStream.read(ContentLengthInputStream.java:164)
at org.apache.http.conn.EofSensorInputStream.read(EofSensorInputStream.java:138)
at com.sun.org.apache.xerces.internal.impl.XMLEntityManager$RewindableInputStream.read(Unknown Source)
at com.sun.org.apache.xerces.internal.impl.io.UTF8Reader.read(Unknown Source)
at com.sun.org.apache.xerces.internal.impl.XMLEntityScanner.load(Unknown Source)
at com.sun.org.apache.xerces.internal.impl.XMLEntityScanner.skipChar(Unknown Source)
at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl$FragmentContentDriver.next(Unknown Source)
at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl.next(Unknown Source)
at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanDocument(Unknown Source)
at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(Unknown Source)
at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(Unknown Source)
at com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(Unknown Source)
at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.parse(Unknown Source)
at com.sun.org.apache.xerces.internal.jaxp.SAXParserImpl$JAXPSAXParser.parse(Unknown Source)
at javax.xml.parsers.SAXParser.parse(Unknown Source)
at javax.xml.parsers.SAXParser.parse(Unknown Source)
at Miser.XMLHelper.readXml(XMLHelper.java:23)
at Miser.main.main(main.java:49)
Exception in thread "main" java.lang.NullPointerException
at Miser.main.main(main.java:65)
java.net.SocketException: socket closed不知道是何原因,求解

解决方案 »

  1.   

    把你的连接服务器,读取返回数据的代码贴出来
    估计是socket超时,或者缓冲区的问题
      

  2.   

    HTTP请求方法package Miser;import java.io.IOException;
    import java.io.InputStream;
    import java.util.List;import org.apache.http.HttpEntity;
    import org.apache.http.HttpResponse;
    import org.apache.http.NameValuePair;
    import org.apache.http.client.ClientProtocolException;
    import org.apache.http.client.HttpClient;
    import org.apache.http.client.entity.UrlEncodedFormEntity;
    import org.apache.http.client.methods.HttpPost;
    import org.apache.http.impl.client.DefaultHttpClient;
    import org.apache.http.params.BasicHttpParams;
    import org.apache.http.params.HttpConnectionParams;
    import org.apache.http.params.HttpParams;
    import org.apache.http.protocol.HTTP;public class HttpHelper {

    public static InputStream Request(String url,List<NameValuePair> parmList) 
    throws ClientProtocolException, IOException {
    InputStream inputStream = Request(url, parmList,null);
    return inputStream;
    }

    public static InputStream Request(String url,List<NameValuePair> parmList,HttpParams httpParameters) throws ClientProtocolException, IOException {
    HttpClient httpClient = new DefaultHttpClient();
    if(httpParameters == null){
    httpParameters = new BasicHttpParams();
    int timeoutConnection = 1000 * 10;
        HttpConnectionParams.setConnectionTimeout(httpParameters, timeoutConnection);
    }

        HttpPost post = new HttpPost(url);
        post.setParams(httpParameters);
        if(parmList != null){
        post.setEntity(new UrlEncodedFormEntity(parmList, HTTP.UTF_8));
        }
       
        HttpResponse response =  httpClient.execute(post);
        HttpEntity entity = response.getEntity();
        InputStream instream = null;
        if (entity != null) {
        instream = entity.getContent();
        }
       
        post.abort();
        return instream;
       }
    }
      

  3.   

    java.net.SocketException: socket closed  
     这个遭关了哦
      

  4.   

    找到出错地方了,我居然在最后调用了HttpPost的abort()方法,导致退出整个请求,所以纠结一天的东西终于结束了