2014-04-20 25 views
2

我想使用java連接到bitcoind。我的計劃是使用htmlunit和gson。現在我可以成功完成一個請求。但是,由於在第五個請求中拋出了SocketTimeoutException,因此我無法完成多於四個後續請求。向本地bitcoind發出四個請求後發生SocketTimeoutException

我想:

  • 請求之間等待。 (無效果可見)
  • 強制失敗的http狀態碼例如通過請求getinfoo而不是getinfo。 (我做不是得到四個失敗的請求後超時)

任何幫助或評論感激!

package test; 

import com.gargoylesoftware.htmlunit.BrowserVersion; 
import com.gargoylesoftware.htmlunit.FailingHttpStatusCodeException; 
import com.gargoylesoftware.htmlunit.HttpMethod; 
import com.gargoylesoftware.htmlunit.WebClient; 
import com.gargoylesoftware.htmlunit.WebRequest; 
import com.google.gson.Gson; 
import java.io.IOException; 
import java.net.SocketTimeoutException; 
import java.net.URL; 

public class Test { 

    public static void main(String[] args) { 

     WebClient client = new WebClient(BrowserVersion.FIREFOX_24); 

     // http://[bitcoind-user]:[password]@localhost:[bitcoind-port] 
     String baseUrl = "http://admin:[email protected]:8332/"; 

     client.getOptions().setTimeout(2000); 
     while (true) { 
      try { 
       WebRequest req = new WebRequest(new URL(baseUrl)); 
       req.setAdditionalHeader("Content-type", "application/json"); 
       req.setHttpMethod(HttpMethod.POST); 

       JSONRequestBody body = new JSONRequestBody(); 
       body.setMethod("getinfo"); 
       req.setRequestBody(new Gson().toJson(body, JSONRequestBody.class)); 

       client.getPage(req); 
       client.closeAllWindows(); 

       System.out.println("ok. (No Exception)"); 

      } catch (SocketTimeoutException tex) { 
       System.out.println("not ok: SocketTimeoutException"); 
      } catch (IOException ex) { 
       System.out.println("not ok: IOException"); 
      } catch (FailingHttpStatusCodeException hex) { 
       System.out.println("not ok: FailingHttpStatusCodeException"); 
      } 
     } 
    } 
} 

(編輯:)

卸下.setTimeout(2000)沒有很好的幫助。測量每個請求的時間表明,他們是相當快:

ok. (No Exception)    Timer: 1.161 seconds 
ok. (No Exception)    Timer: 0.112 seconds 
ok. (No Exception)    Timer: 0.115 seconds 
ok. (No Exception)    Timer: 0.075 seconds 
not ok: SocketTimeoutException Timer: 90.119 seconds 
not ok: SocketTimeoutException Timer: 90.145 seconds 
not ok: SocketTimeoutException Timer: 90.134 seconds 

使用curl終端重複相同的請求多次,總是花了不到一秒鐘,這樣bitcoind不應引起的問題。

+0

至少在2.14版本中似乎有一個錯誤。我可以讓我的腳本在2.10和2.15上工作...... – user2084795

回答

0

首先,嘗試刪除這條線:

client.getOptions().setTimeout(2000); 

如果客戶端需要2秒或更長時間來處理第五請求它顯然失敗超時異常。

其次,如果您確實不需要它,請確保您禁用JavaScript,因爲它也可能需要超過2秒的時間才能處理。

+0

我禁用了JS並刪除了'setTimeout'。然而,同樣的行爲仍然是可觀察的。 – user2084795