2012-04-27 93 views
1

我正在写一个文件上传应用程序。我可以使用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秒到断开活动连接?此外,是否有可能知道何时建立连接?

回答

1

在您的活动中使用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)。

+0

我的发送文件方法在扩展AsyncTask 的类中。我得到'不能创建处理程序内部线程没有调用Looper.prepare()'的错误。是否有任何解决方法来执行您的建议?感谢 – 2012-04-27 17:11:31

+0

尝试将此代码放入AsyncTask的onPreExecute()中。 – Akhil 2012-04-27 17:17:31

+0

谢谢,它的工作原理。我把'httpAsync.mRedrawHandler.doJob(60000);'之前“HttpResponse响应= client.execute(httpPost,localContext);”。但它不是我想要的100%。实际上,我想在连接建立成功后启动'doJob(60000)'。有没有可能检测到它? – 2012-04-27 17:23:49

2

您是否尝试过设置套接字超时?它不同于连接超时。

params.setParameter(HttpConnectionParams.SO_TIMEOUT, 60000); 

其中paramsBasicHttpParams一个实例,它是通过成DefaultHttpClient构造。

+0

是的,我试过(我编辑了这个问题,并把代码片段)。我认为SO_TIMEOUT是丢失套接字连接的超时值。 – 2012-04-27 16:35:18

+0

实际上,我想在建立连接后60秒关闭连接。可能吗?谢谢 – 2012-04-27 16:36:26

相关问题