2013-07-05 168 views
0

在Java中,我希望每隔5秒發送一次HttpPost,而不必等待響應。我怎樣才能做到這一點?如何每5秒發送一次HttpPost

我使用下面的代碼:

HttpClient httpClient = new DefaultHttpClient(); 
HttpPost post = new HttpPost(url); 
StringEntity params = new StringEntity(json.toString() + "\n"); 
post.addHeader("content-type", "application/json"); 
post.setEntity(params); 
httpClient.execute(post); 

Thread.sleep(5000); 

httpClient.execute(post); 

,但它不工作。

即使我失去了以前的連接並建立了一個新的連接發送第二個連接,第二個執行功能始終被阻止。

+0

此代碼是否在循環中? – fvrghl

+0

它不起作用不是診斷。 「封鎖」和「不起作用」是什麼意思? – kolossus

+0

「blocked」的意思是「httpClient.execute(post)」會一直等待數據(或響應),如果不是,它會一直被阻塞,不起作用意味着 - 如果我像這樣運行我的程序,將得到異常:java.lang.IllegalStateException:無效的BasicClientConnManager的使用:連接仍然分配。請確保在分配另一個連接之前釋放連接。 – user2552010

回答

3

你的問題留下了一大堆的問題,但它的基本點可以通過以下方式實現:

while(true){ //process executes infinitely. Replace with your own condition 

    Thread.sleep(5000); // wait five seconds 
    httpClient.execute(post); //execute your request 

} 
+0

我想我必須在發送新請求之前釋放以前的連接。但我不想使用「EntityUtils.consume(entity);」因爲如果服務器沒有響應,它將始終在「httpClient.execute(post)」中被阻止。 – user2552010

1

我想你的代碼,我得到了異常: java.lang.IllegalStateException:使用無效的BasicClientConnManager:連接仍然分配。 確保在分配另一個連接之前釋放連接。

此異常已經登錄HttpClient 4.0.1 - how to release connection?

我能夠通過消耗用下面的代碼的響應釋放連接:

public void sendMultipleRequests() throws ClientProtocolException, IOException, InterruptedException { 
    HttpClient httpClient = new DefaultHttpClient(); 
    HttpPost post = new HttpPost("http://www.google.com"); 
    HttpResponse response = httpClient.execute(post); 

    HttpEntity entity = response.getEntity(); 
    EntityUtils.consume(entity); 

    Thread.sleep(5000); 

    response = httpClient.execute(post); 
    entity = response.getEntity(); 
    EntityUtils.consume(entity); 
} 
+0

根據你的回覆,如果服務器不向我的HttpClient發送任何響應,代碼「response = httpClient.execute(post);」將始終被阻止,對吧?如果我不想被阻擋,我該怎麼辦? – user2552010

+0

有什麼辦法可以每隔5秒發送一次請求並忽略響應(也許沒有響應從服務器發回給我)? – user2552010

1

使用DefaultHttpClient是同步的,這意味着程序被阻塞,等待響應。您可以使用async-http-client庫來執行異步請求(如果您不熟悉Maven,可以從search.maven.org下載jar文件)。示例代碼可能如下所示:

import com.ning.http.client.*; //imports 

try { 
     AsyncHttpClient asyncHttpClient = new AsyncHttpClient(); 

     while(true) { 

      asyncHttpClient 
        .preparePost("http://your.url/") 
        .addParameter("postVariableName", "postVariableValue") 
        .execute(); // just execute request and ignore response 

      System.out.println("Request sent"); 

      Thread.sleep(5000); 
     } 
    } catch (Exception e) { 
     System.out.println("oops..." + e); 
    } 
+0

我嘗試了你的代碼,但如果沒有響應,仍然會被下一個請求阻塞。 – user2552010

+0

你可以發佈你測試過的代碼嗎?它與我的代碼完全相同嗎?我已經在發佈之前對它進行了測試,一切正常。你如何得出程序執行被阻止的結論? –