如果连接异常结束,在read的时候就会报错.
java.net.SocketException: Connection reset
at java.net.SocketInputStream.read(Unknown Source)
at java.net.SocketInputStream.read(Unknown Source)我想知道怎避免这种情况发生,能不能在读的时候判断下?还是只能catch这个异常来判断?

解决方案 »

  1.   

    socketInputStream.available()试试,我没试过
      

  2.   

    楼主的问题应该是出在把sockets关闭前程序正在阻塞等待,
    结果没有把sockets关闭,下一次连接的时候就会跑出这个异常
      

  3.   

    网上还有种说法:
    一般是有些客户端已关闭,一些线程因为延迟等原因觉察不到此连接已结束,继续等到到出错或是 客户端那里不停刷或一个访问/刷新没完成前再刷,要让这个无用的线程死掉和这个错误如果不影响应用运行的话大可不必理会。有一种抛出这个异常的情况是:
    浏览器请求了一个服务器端资源,在响应回来之前转而请求其他的资源。这个时候最初的浏览器跟服务器的连接中断,服务器的peer程序就会reset那个connection。
      

  4.   


    catch 是必要的,即使你能在 read() 之前判断了,如果没有问题,再开始 read(),那么在 read() 的过程中还是可能断掉。
      

  5.   

    to maquan :
    恩,我也想过.只要你是在read前判断的,read的时候还是有可能出错...
    那还是直接catch好了..
      

  6.   

    还是有问题....有的时候程序会被阻塞住..
    能帮忙看下这个程序有什么问题么? private String getXMLFromInputStream(InputStream inStream) throws IOException{
    try{
    StringBuffer sbInputXML=new StringBuffer();
    FindByRegExp finder=new FindByRegExp();
    String charset=DEFAULT_CHARSET;
    boolean endOfXML=false;
    boolean isXmlContent=false;
    InputStreamReader inputStreamReader=new InputStreamReader(inStream,DEFAULT_CHARSET);
    BufferedReader reader=new BufferedReader(inputStreamReader);
    String xmlCharset=null;
    while(!endOfXML){
    String strLine = null;
    if (true) {
    strLine = reader.readLine();
    }
    if (strLine == null) {
    return null;// break out loop
    } else {
    strLine = new String(strLine.getBytes(DEFAULT_CHARSET), charset);
    // get CharSet of XML
    if (xmlCharset == null) {
    xmlCharset = finder.find("(?<=encoding\\=\").*(?=\"\\?\\>)", strLine);
    if (xmlCharset != null) {
    charset = xmlCharset;
    }
    }
    // process head flag and end flag of message
    if (strLine.indexOf(BEGIN_OF_XML) != -1) {
    isXmlContent = true;
    strLine = "";
    } else if (strLine.indexOf(END_OF_XML) != -1) {
    endOfXML = true;
    isXmlContent = false;
    } else if (strLine.indexOf(END_OF_CONNECTION) != -1) {
    return END_OF_CONNECTION;// break out loop
    }
    // XML
    if (isXmlContent) {
    sbInputXML.append(strLine);
    sbInputXML.append("\n");
    }
    }
    }
    String ret=sbInputXML.toString().trim();
    if("".equals(ret.replaceAll("\n", ""))){
    return null;
    }else{
    return ret;
    }

    } catch (SocketException se) {
    // se.printStackTrace();
    return null;
    } }