日期:2014-05-20  浏览次数:20728 次

一个奇怪的问题,关于HttpURLConnection
问题是这样的,在a.jsp页面调用以下sendAndReceive方法,传入一个String srcUrl。这个srcUrl是通过一个配置文件获得的,且只会初始化一次。
然后这个方法返回null,报:java.io.IOException: Read channel closed
奇怪的事情来了,刷新该页面,也就是重新调用该方法一次(不会再次初始化配置文件,因为有判断),就能返回成功的信息。

另外,把这个方法的调用写在另外一个页面 b.jsp,然后a.jsp只初始化配置文件,b.jsp调用这个方法,居然也成功了,但是写在一起就报错,但只要再次刷新页面就不会出错,我就是想不明白啊。

按说这个方法调用二次就可以成功,那我在初始化配置文件后,连续调用这个方法2次(同一个jsp),还是报一样的错误,且只能通过其他页面调用或者本页面刷新,才能成功....郁闷

Java code

public String sendAndReceive(String srcUrl)
    {
        HttpURLConnection connection = null;
        InputStream in = null;
        try
        {
            URL url = new URL(srcUrl);
            connection = (HttpURLConnection)url.openConnection();
            connection.setRequestProperty("User-Agent", "Mozilla/MSIE");
            int contentLen = connection.getContentLength();
            in = connection.getInputStream();
            if(contentLen <= 0)
            {
                contentLen = bufLen;
                int offset = 0;
                do
                {
                    int len = in.read(buffer, offset, contentLen - offset);
                    if(len <= 0)
                        break;
                    offset += len;
                } while(true);
                contentLen = offset;
            } else
            {
                if(contentLen > bufLen)
                {
                    buffer = new byte[contentLen];
                    bufLen = contentLen;
                }
                int offset = 0;
                do
                {
                    int len = in.read(buffer, offset, contentLen - offset);
                    if(len <= 0)
                        break;
                    offset += len;
                } while(true);
                contentLen = offset;
            }
            String resMsg = connection.getHeaderField(0);
            if(resMsg.toLowerCase().indexOf("ok") < 0)
            {
                return null;
            } else
            {
                connection.disconnect();
                in.close();
                String content = new String(buffer, 0, contentLen);
                return content;
            }
        }
        catch(Exception e)
        {
            if(connection != null)
                connection.disconnect();
            if(in != null)
                try
                {
                    in.close();
                }
                catch(IOException ioexception) { }
            e.printStackTrace();
            return null;
        }
    }



忘了说了,这个是银行的交易对账单下载。

------解决方案--------------------
connection.disconnect();
去掉它试试
------解决方案--------------------
看不懂的哦.
------解决方案--------------------
connection.disconnect(); 

去掉了能好吗