是否可以设置超时断开建立的http连接?
我正在写一个文件上传应用程序。我可以使用asyn方法连接到服务器并上传文件(apache http)。
服务器已将连接数限制设置为100.如果连接持续60秒,我想要设置连接超时以断开连接。
以下是流程:
(1)Android客户端建立与服务器的连接。 (开始计数为60s)
(2)如果连接在60s后仍然存在,则断开与Android客户端的连接是否可以设置超时断开建立的http连接?
我知道为HttpParams设置超时不起作用。我不知道如何去做。
任何人有想法如何做到这一点?任何解决方案或建议是受欢迎的。谢谢!
下面是如何上传文件的代码片段:
try
{
HttpParams httpParameters = new BasicHttpParams();
HttpConnectionParams.setConnectionTimeout(httpParameters, 60000);
HttpConnectionParams.setSoTimeout(httpParameters, 60000);
HttpClient client = new DefaultHttpClient(httpParameters);
...
ByteArrayBody bab = new ByteArrayBody(byteArray, "photo.jpg");
entity.addPart("photo", bab);
httpPost.setEntity(entity);
startTime = System.currentTimeMillis();
//ClientConnectionRequest connRequest = new ManagedClientConnection();
//httpPost.setConnectionRequest((ClientConnectionRequest) connRequest.getConnection(3000, TimeUnit.MILLISECONDS));
HttpResponse response = client.execute(httpPost, localContext);
Handler mHandler = new Handler();
BufferedReader reader = new BufferedReader(new InputStreamReader(response.getEntity().getContent(), "UTF-8"));
String result = "";
String tmp = "";
while ((tmp = reader.readLine()) != null)
{
result += tmp;
}
reader.close();
return result;
} catch (Exception e) {
Log.e(TAG, "error time = " + (System.currentTimeMillis() - startTime));
Log.e("httpUploadHandler", "Some error came up");
Log.e("httpUploadHandler", e.toString());
}
我可以断开连接通过调用:
client.getConnectionManager().shutdown();
但我怎么能算60秒到断开活动连接?此外,是否有可能知道何时建立连接?
在您的活动中使用Handler来完成这项工作。下面的代码会给你一个想法:从主线程
private ShutDownHandler mRedrawHandler = new ShutDownHandler();
class ShutDownHandler extends Handler {
@Override
public void handleMessage(Message msg) {
client.getConnectionManager().shutdown();
}
public void doJob(long delayMillis) {
this.removeMessages(0);
sendMessageDelayed(obtainMessage(0), delayMillis);
}
};
呼叫mRedrawHandler.doJob(60000)。
您是否尝试过设置套接字超时?它不同于连接超时。
params.setParameter(HttpConnectionParams.SO_TIMEOUT, 60000);
其中params
是BasicHttpParams
一个实例,它是通过成DefaultHttpClient
构造。
是的,我试过(我编辑了这个问题,并把代码片段)。我认为SO_TIMEOUT是丢失套接字连接的超时值。 – 2012-04-27 16:35:18
实际上,我想在建立连接后60秒关闭连接。可能吗?谢谢 – 2012-04-27 16:36:26
我的发送文件方法在扩展AsyncTask的类中。我得到'不能创建处理程序内部线程没有调用Looper.prepare()'的错误。是否有任何解决方法来执行您的建议?感谢 –
2012-04-27 17:11:31
尝试将此代码放入AsyncTask的onPreExecute()中。 – Akhil 2012-04-27 17:17:31
谢谢,它的工作原理。我把'httpAsync.mRedrawHandler.doJob(60000);'之前“HttpResponse响应= client.execute(httpPost,localContext);”。但它不是我想要的100%。实际上,我想在连接建立成功后启动'doJob(60000)'。有没有可能检测到它? – 2012-04-27 17:23:49