【问题标题】:Is it possible to set timeout to disconnect established http connection?是否可以设置超时以断开已建立的 http 连接?
【发布时间】:2012-05-08 08:17:24
【问题描述】:

我正在编写一个文件上传应用程序。我可以使用 asyn 方法连接到服务器并上传文件(apache http)。
服务器已将连接数限制为100。我想设置连接超时以断开连接,如果连接持续60s。

这是流程:
(1) Android客户端建立与服务器的连接。 (开始计数 60 秒)
(2) 如果连接60s后仍然存在,则断开与Android客户端的连接

我知道为 HttpParams 设置超时不起作用。我不知道该怎么做。
有人知道该怎么做吗?欢迎任何解决方案或建议。谢谢!

这里是如何上传文件的代码sn-p:

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 秒来断开活动连接呢?另外,是否可以知道何时建立连接?

【问题讨论】:

    标签: java android timeout http-post connection-timeout


    【解决方案1】:

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

    params.setParameter( HttpConnectionParams.SO_TIMEOUT, 60000 );
    

    其中paramsBasicHttpParams的一个实例,它被传递到DefaultHttpClient的构造函数中。

    【讨论】:

    • 是的,我试过了(我编辑了问题并将代码 sn-p 放入其中)。我认为 SO_TIMEOUT 是丢失套接字连接的超时值。
    • 其实我想在连接建立60秒后关闭连接。可能吗?谢谢
    【解决方案2】:

    在您的活动中使用处理程序来完成这项工作。下面的代码会给你一个想法:

     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)。

    【讨论】:

    • 我的发送文件方法在一个扩展 AsyncTask 的类中。我收到“无法在未调用 Looper.prepare() 的线程内创建处理程序”的错误。可以按照您的建议解决吗?谢谢
    • 谢谢,它有效。我把'httpAsync.mRedrawHandler.doJob(60000);'在“HttpResponse response = client.execute(httpPost, localContext);”之前。但这不是我想要的 100%。实际上,我想在连接成功后启动'doJob(60000)'。有可能检测到吗?
    • 我目前不知道有任何回调方法通知连接已建立。我会尽快通知你。
    • 感谢阿基尔!你帮了我很多
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-04
    • 2020-02-13
    • 2016-12-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多