2

javaを使ってbitcoinに接続したい。私の計画は、htmlunit と gson を使用することです。現在、1 つのリクエストを正常に完了することができます。ただし、5 番目の要求で SocketTimeoutException がスローされるため、正確に4 つ以上の後続の要求を行うことはできません。

私は試した:

  • リクエスト間で待機中。(効果は見られません)
  • 失敗した http ステータス コードを強制する。たとえばgetinfoogetinfo. (リクエストが4回失敗した後、タイムアウトになりません)

ヘルプやコメントをいただければ幸いです。

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:admin@localhost: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常に 1 秒もかからないためbitcoind、問題が発生することはありません。

4

1 に答える 1

0

まず、次の行を削除してみてください。

client.getOptions().setTimeout(2000);

クライアントが 5 番目の要求を処理するのに 2 秒以上かかる場合、明らかにタイムアウト例外で失敗します。

2 番目に、処理に 2 秒以上かかる場合があるため、本当に必要でない場合は JavaScript を無効にしてください。

于 2014-04-20T14:17:35.037 に答える