Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 对本地比特币发出四次请求后的SocketTimeoutException_Java_Htmlunit_Bitcoind - Fatal编程技术网

Java 对本地比特币发出四次请求后的SocketTimeoutException

Java 对本地比特币发出四次请求后的SocketTimeoutException,java,htmlunit,bitcoind,Java,Htmlunit,Bitcoind,我想使用java连接到比特币。我的计划是使用htmlunit和gson。现在我可以成功地完成一个请求。但是,由于在第五个请求中抛出了SocketTimeoutException,因此我只能执行四个后续请求 我试过: 在请求之间等待。(无明显影响) 强制执行失败的http状态代码,例如,通过请求getinfoo而不是getinfo。(四次请求失败后,我没有得到超时) 任何帮助或评论都将不胜感激 package test; import com.gargoylesoftware.htmluni

我想使用java连接到比特币。我的计划是使用htmlunit和gson。现在我可以成功地完成一个请求。但是,由于在第五个请求中抛出了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: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秒,因此
比特币
不应引起问题。

首先,尝试删除此行:

client.getOptions().setTimeout(2000);
如果客户端需要2秒或更长的时间来处理第五个请求,它显然会失败并出现超时异常


其次,如果不需要JavaScript,请确保禁用它,因为处理它也可能需要2秒钟以上。

我已禁用JS并删除了
setTimeout
。然而,同样的行为仍然可以观察到,似乎2.14版本中至少有一个bug。我可以让我的脚本在2.10和2.15上运行。。。