Http连接超时无效,好多天了,要逼疯了,求人解救啊

baidu_24732779 2014-12-23 08:40:17
private void uploadFile() {
try {
String end = "\r\n";
String twoHyphens = "--";
// 分割符号
String boundary = "*****";
URL url = new URL(uploadUrl);
HttpURLConnection httpURLConnection = (HttpURLConnection) url
.openConnection();
httpURLConnection.setConnectTimeout(5000);
httpURLConnection.setReadTimeout(5000);
/* 允许Input、Output,不使用Cache */
httpURLConnection.setDoInput(true);
httpURLConnection.setDoOutput(true);
httpURLConnection.setUseCaches(false);
/* 设置传送的method=POST */
httpURLConnection.setRequestMethod("POST");
/* setRequestProperty */
httpURLConnection.setRequestProperty("Connection", "Keep-Alive");
httpURLConnection.setRequestProperty("Charset", "UTF-8");
httpURLConnection.setRequestProperty("Content-Type",
"multipart/form-data;boundary=" + boundary);

httpURLConnection.setChunkedStreamingMode(1024);
httpURLConnection.connect();

/* 设置DataOutputStream */
DataOutputStream dataOutputStream = new DataOutputStream(
httpURLConnection.getOutputStream());
dataOutputStream.writeBytes(twoHyphens + boundary + end);
dataOutputStream.writeBytes("Content-Disposition: form-data; "
+ "name =\"file1\";filename=\"" + newName + "\"" + end);
dataOutputStream.writeBytes(end);
/* 取得文件的FileInputStream */
File file = new File(uploadFile);
fileLenth = file.length();
Log.d(LOG_STRING, "文件的总长度为" + file.length());
FileInputStream fileInputStream = new FileInputStream(file);
/* 设置每次写入1024bytes */
int bufSize = 1024;
byte[] buf = new byte[bufSize];
int length = -1;
/* 从文件读取数据至缓冲区 */
int num = 0;
double speed = 0;
while ((length = fileInputStream.read(buf)) != -1) {
/* 将资料写入DataOutputStream中 */
// SystemClock.sleep(100);
dataOutputStream.write(buf, 0, length);
dataOutputStream.flush();
num = num + length;
speed = (double) num / (double) fileLenth;
DecimalFormat df = new DecimalFormat("#.00");
int en = (int) (Double.valueOf(df.format(speed)) * 100);
Message message = new Message();
Bundle bundle = new Bundle();
bundle.putInt("data", en);
message.what = 1;
message.setData(bundle);
handler.sendMessage(message);
Log.e(LOG_STRING, "正在写入" + num);
}
dataOutputStream.writeBytes(end);
dataOutputStream.writeBytes(twoHyphens + boundary + twoHyphens
+ end);
/* close streams */
fileInputStream.close();
dataOutputStream.flush();
/* 取得Response内容 */
Log.v(LOG_STRING, "正在发送数据");
InputStream is = httpURLConnection.getInputStream();
Log.v(LOG_STRING, "已经发送完数据");
int ch;
StringBuffer buffer = new StringBuffer();
while ((ch = is.read()) != -1) {
buffer.append((char) ch);
Log.d(LOG_STRING, "读取服务器信息" + buffer.toString());
}
if (buffer.toString().equals("success")) {
Message message = new Message();
Bundle bundle = new Bundle();
bundle.putInt("data", 1000);
message.what = 1;
message.setData(bundle);
handler.sendMessage(message);
Log.d(LOG_STRING, "上传成功");
}
/* 将Response显示于Dialog */

/* 关闭DataOutputStream */
dataOutputStream.close();
httpURLConnection.disconnect();
} catch (IOException e) {
e.printStackTrace();
Message message = new Message();
Bundle bundle = new Bundle();
bundle.putInt("data", 1000);
message.what = 1;
message.setData(bundle);
handler.sendMessage(message);
}
}


超时连接设置无效,当客户端与服务器端连接,客户端进行写入文件时,这时候如果客户端网速不好的状态下,会卡死在写数据的这句话这里dataOutputStream.write(buf, 0, length);
即使我设置了读取数据超时为5秒,还是几分钟之后抛出sendTo异常,或者一直就阻塞在那里卡死了,我在Log里看了,不是写数据慢,而是根本就卡死在那里了,设置的超时根本没有任何效果,请问这是为什么呢?
...全文
1576 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
_周星星 2016-12-28
  • 打赏
  • 举报
回复
找服务器那哥们 连调三 直接连他的电脑 你自己瞎琢磨 万一是他那边的问题 你一个人又不能解决
大聪明超聪明 2016-12-16
  • 打赏
  • 举报
回复
楼主解决了吗 我也遇到了 什么愿意呢?怎么解决 求大神指点
guoyanfang_yuge 2016-02-23
  • 打赏
  • 举报
回复
你好这个问题解决了么?我也遇到了,求帮忙
开发者_android 2015-01-27
  • 打赏
  • 举报
回复
timeout时间设置长一些,还有就是看看服务器端可设置每个连接保持连接状态的时间是多久。
baidu_24732779 2015-01-27
  • 打赏
  • 举报
回复
引用 14 楼 poping888 的回复:
2.3以下的就不要用HttpURLConnection了,有bug,官网已经说了,建议换一下HttpClient4.X,有个老外封装的Android版的HttpClient,就基于这个版本的,还有OkHttp用的是组合方式,他会判断sdk版本,好像如果小于2.3用的是HttpClient,大于的话就用HttpURLConnection,具体你可以翻看一下OKHttp源码,我下载用的HttpClient,报文接收用的OKHttp
我用了第三方的包,貌似也没用~~
阳哥说全栈 2015-01-23
  • 打赏
  • 举报
回复
2.3以下的就不要用HttpURLConnection了,有bug,官网已经说了,建议换一下HttpClient4.X,有个老外封装的Android版的HttpClient,就基于这个版本的,还有OkHttp用的是组合方式,他会判断sdk版本,好像如果小于2.3用的是HttpClient,大于的话就用HttpURLConnection,具体你可以翻看一下OKHttp源码,我下载用的HttpClient,报文接收用的OKHttp
画虎烂 2015-01-23
  • 打赏
  • 举报
回复
耗时的都要在子线程做
baidu_24732779 2015-01-22
  • 打赏
  • 举报
回复
引用 11 楼 youngc527 的回复:
[quote=引用 4 楼 youngc527 的回复:] 如果是写超时的话,设置 socket timeout 试试? HttpConnectionParams.setSoTimeout
那就改用 HttpClient 试试呗,又不要钱。而且还可以用 apache 的multipart 组件实现上传,省得自己写代码了。[/quote] 用了android-async-http-master第三方包发现上传图片还是会出现这种问题,那个HttpClient也用了,我不知道是服务器端的错误,还是我这的问题。郁闷啊~~~~服务器端貌似那哥们用的是这个源码 http://www.cnblogs.com/gzggyy/archive/2011/08/02/2125237.html
Darcy杨 2014-12-26
  • 打赏
  • 举报
回复
引用 4 楼 youngc527 的回复:
如果是写超时的话,设置 socket timeout 试试? HttpConnectionParams.setSoTimeout
那就改用 HttpClient 试试呗,又不要钱。而且还可以用 apache 的multipart 组件实现上传,省得自己写代码了。
baidu_24732779 2014-12-25
  • 打赏
  • 举报
回复
引用 9 楼 mathCoder 的回复:
一般会在子线程上进行处理吧。。。程序也不会卡死。 试一试在超时前是否会持续写入数据,还是等待响应后写入。如果是那样就可以自定义个超时处理。 腾讯QQ消息传送应该都是传输层吧?怎么会应用层?
蛋疼,因为传输的文件大小是不一定的,没办法限定死时间,这样的话要每写一句话就开计时器看看阻塞没有,如果阻塞了关掉,没阻塞继续计时,太耗费性能了~~
baidu_24732779 2014-12-24
  • 打赏
  • 举报
回复
引用 7 楼 sxqfire 的回复:
网络情况不好,你就catch住就行了,然后处理异常,在异常中重新连接或者调用write方法,还有,这个一定新开一个线程去操作
现在的问题是,即使刚开始已经写了部分数据了,但是由于写入过程中网速不好,会卡死在那里,但是抛sendto异常要等几分钟之后再抛,而不是我设置的5秒,抓这个异常的时间太长,客户会以为程序已经死了的,用户体验不好。不是我抓不抓的到异常的问题,传输是以流来传输的,还不能确定死的传输时间。
暴龙神 2014-12-24
  • 打赏
  • 举报
回复
网络情况不好,你就catch住就行了,然后处理异常,在异常中重新连接或者调用write方法,还有,这个一定新开一个线程去操作
qq_24469257 2014-12-24
  • 打赏
  • 举报
回复
你打开了上网的权限没?
baidu_24732779 2014-12-24
  • 打赏
  • 举报
回复
引用 4 楼 youngc527 的回复:
如果是写超时的话,设置 socket timeout 试试? HttpConnectionParams.setSoTimeout
木有用,主要我用的是HttpURLConnection,无解,不知道腾讯QQ是怎么做的,CSDN的大神们快来解决啊~~
Darcy杨 2014-12-24
  • 打赏
  • 举报
回复
如果是写超时的话,设置 socket timeout 试试? HttpConnectionParams.setSoTimeout
mathCoder 2014-12-24
  • 打赏
  • 举报
回复
一般会在子线程上进行处理吧。。。程序也不会卡死。 试一试在超时前是否会持续写入数据,还是等待响应后写入。如果是那样就可以自定义个超时处理。 腾讯QQ消息传送应该都是传输层吧?怎么会应用层?
baidu_24732779 2014-12-23
  • 打赏
  • 举报
回复
一个人都没有。。。。唉。。。。。
baidu_24732779 2014-12-23
  • 打赏
  • 举报
回复
引用 2 楼 sagittarius1988 的回复:
dataOutputStream.writeBytes(end); 这句之后,先flush,然后继续执行,超时还有读取超时的,这个看服务器的响应
主要是刚开始能写入数据,写几句之后,如果写入过程中网速不好,就有可能卡在写的那句话上
sagittarius1988 2014-12-23
  • 打赏
  • 举报
回复
dataOutputStream.writeBytes(end); 这句之后,先flush,然后继续执行,超时还有读取超时的,这个看服务器的响应

80,351

社区成员

发帖
与我相关
我的任务
社区描述
移动平台 Android
androidandroid-studioandroidx 技术论坛(原bbs)
社区管理员
  • Android
  • yechaoa
  • 失落夏天
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧