Bitcoind JSON-RPC:Java Jersey 客户端:来自服务器错误的文件意外结束

Posted

技术标签:

【中文标题】Bitcoind JSON-RPC:Java Jersey 客户端:来自服务器错误的文件意外结束【英文标题】:Bitcoind JSON-RPC : Java Jersey Client : Unexpected end of file from server Error 【发布时间】:2014-09-08 14:42:47 【问题描述】:

我对比特币很陌生,这是我第一次尝试使用 bitcoind。

我们一直在尝试使用 bitcoind(使用 testnet)在 BTC 上开发基于 Java 的应用程序。我们使用带有基本身份验证的 Jersey 客户端使用简单的 HTTP Post,如下所示。我们已经将 jersey 客户端作为项目依赖项的一部分。我们在 Mac OS 上运行。 bitcoind 和 java 客户端托管在同一个系统中。

Client client = Client.create();

String url = "http://"+username+':'+password+"@localhost:18333";
//String url = "http://localhost:18333";
System.out.println("URL is : "+url);
WebResource webResource = client.resource(url);

Authenticator.setDefault(new Authenticator() 
    protected PasswordAuthentication getPasswordAuthentication() 
   return new PasswordAuthentication (username, password.toCharArray());
    
    );

String input = "\"method\":\"getblockcount\",\"params\":[],\"id\":\"1\"";
ClientResponse response = webResource.type("application/json").post(ClientResponse.class, input);

当我们执行这个时,我们得到了

Caused by: java.net.SocketException: Unexpected end of file from server
   at sun.net.www.http.HttpClient.parseHTTPHeader(HttpClient.java:772)
   at sun.net.www.http.HttpClient.parseHTTP(HttpClient.java:633)
   at sun.net.www.http.HttpClient.parseHTTPHeader(HttpClient.java:769)

据我了解的例外情况是,存在一些服务器端错误,但我无法在日志文件中看到错误。 degug.log 没有提供任何详细信息。

bitcoin.conf文件中的条目如下:

rpcuser=bitcoinrpc
rpcpassword=5UKQTzWTf7EEJnkShZhr9tbjpDVNmLMgQkFfWsnZhLey
testnet=1
server=1

我也尝试使用 json-rpc 客户端与 bitcoind 集成,这导致了同样的错误。

非常感谢解决此错误的任何帮助。先感谢您。如果您需要更多详细信息,请告诉我。

问候, 曼朱纳特

====== 编辑 ======

当我检查请求和响应时,它给出“远程服务器在发送响应标头之前关闭连接”错误作为 HTTP 失败场景的一部分。以下是请求数据内容:

网址:http://192.168.2.111:18333/

请求数据:

“方法”:“getblockcount”, “参数”:[], “身份证”:“1”

请帮助我了解错误在哪里。

================ 编辑=================

将以下条目添加到 bitcoin.conf 以允许来自客户端的连接。但仍然面临同样的错误:

rpcallowip=192.168.2.111
rpcallowip=127.0.0.1

问候, 曼朱纳特

【问题讨论】:

【参考方案1】:

经过所有的调整,我能够让它正常工作。为了他人的利益,这里是对 bitcoind 进行 JSON-RPC 调用的 Java 代码(使用 Jersey 客户端):

bitcoin.conf 条目:

rpcuser=bitcoinrpc
rpcpassword=5UKQTzWTf7EEJnkShZhr9tbjpDVNmLMgQkFfWsnZhLey    
testnet=1
server=1
#txindex=1
rpcallowip=192.168.2.*
rpcallowip=127.0.0.1
rpcport=8999
#rpctimeout=60000

确保您更改了端口号,并且不要忘记提供指向相应 IP 地址的 rpcallowip 条目。

客户代码:

DefaultClientConfig config = new DefaultClientConfig();

config.getFeatures().put(JSONConfiguration.FEATURE_POJO_MAPPING,
            Boolean.TRUE);
Client client = Client.create(config);
client.addFilter(new HTTPBasicAuthFilter(username, password));
WebResource webResource = client.resource(url);
String input = "\"id\":\"jsonrpc\",\"method\":\"listaccounts\",\"params\":[]";
ClientResponse response = webResource.accept("application/json").type("application/json")
           .post(ClientResponse.class, input);

就是这样。您可以从 bitcoind 集成开始。

问候, 曼朱纳特

【讨论】:

以上是关于Bitcoind JSON-RPC:Java Jersey 客户端:来自服务器错误的文件意外结束的主要内容,如果未能解决你的问题,请参考以下文章

bitcoined

为 java 和 javascript 推荐一个 JSON-RPC 库 [关闭]

java中有没有好的兼容JSON-RPC 1.0的客户端库?

如何从 bitcoind 服务器获取硬币地址余额?

JSON-RPC轻量级远程调用协议介绍及使用

比特币全节点(bitcoind)