当前位置:编程学习 > wap >>

下载文件时,报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
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,