一个奇怪的问题,关于HttpURLConnection
问题是这样的,在a.jsp页面调用以下sendAndReceive方法,传入一个String srcUrl。这个srcUrl是通过一个配置文件获得的,且只会初始化一次。
然后这个方法返回null,报:java.io.IOException: Read channel closed
奇怪的事情来了,刷新该页面,也就是重新调用该方法一次(不会再次初始化配置文件,因为有判断),就能返回成功的信息。
另外,把这个方法的调用写在另外一个页面 b.jsp,然后a.jsp只初始化配置文件,b.jsp调用这个方法,居然也成功了,但是写在一起就报错,但只要再次刷新页面就不会出错,我就是想不明白啊。
按说这个方法调用二次就可以成功,那我在初始化配置文件后,连续调用这个方法2次(同一个jsp),还是报一样的错误,且只能通过其他页面调用或者本页面刷新,才能成功....郁闷
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; } }