下载文件时,报socketTimeoutException问题,请高手分析
从一个服务器下载文件,代码如下(在一个子线程中运行):try {
URL dlFile = new URL("http://192.168.1.100:8080/a.apk");
HttpURLConnection conn = (HttpURLConnection)dlFile.openConnection();
InputStream in = conn.getInputStream();
byte[] data = new byte[32*1024];
int readSize = -1;
int totalSize = 0;
while((readSize = in.read(data, 0, 32*1024)) > 0)
{
totalSize += readSize;
}
conn.disconnect();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
myTextView.setText("download error.");
}
1、当文件比较大(大于1M)或很小(小于100K)时,下载都很正常。
2、将代码添加到另一个测试工程中运行,文件下载正常。
当下载几百K的文件时,经常报socketTimeoutException异常:
02-06 11:52:17.038: W/System.err(533): java.net.SocketTimeoutException
02-06 11:52:17.040: W/System.err(533): at org.apache.harmony.luni.net.PlainSocketImpl.read(PlainSocketImpl.java:461)
02-06 11:52:17.040: W/System.err(533): at org.apache.harmony.luni.net.SocketInputStream.read(SocketInputStream.java:85)
02-06 11:52:17.051: W/System.err(533): at java.io.BufferedInputStream.read(BufferedInputStream.java:319)
抓包分析,异常的时候,通常是客户端侧上报了ZeroWindow,然后就没有新的包发下来了,客户端也不再向服务器发送更新TCP Windows的消息。比如:
TCP ZeroWindow
TCP Keep-Alive
TCP ZeroWindow
TCP Keep-Alive
重复几次,直到超时。
下载期间,网络状态一直很好。且使用浏览器每次都能正常下载。
定位了几天,没什么头绪。分析起来,好像是TCP协议底层有问题。但新开发的程序却可以正常下载。
不知有什么原因导致下载失败?
--------------------编程问答-------------------- 你是用模拟还是手机?如果用手机的话,用GPRS的网络是访问不到你的IP的 --------------------编程问答-------------------- 看不懂。。
1、当文件比较大(大于1M)或很小(小于100K)时,下载都很正常。
你的缓冲区不是只有32k吗?
TCP ZeroWindow
是不是滑动窗口满了?数据到达但你一直没取所以导致缓冲区满了?
补充:移动开发 , Android