La publicación http a través de java a bitcoind no funciona

Estoy usando Ubuntu Server 12.04. Mi archivo *.conf:

...
# Enable RPC
server=1

# Uncomment to allow localhost to use RPC
rpcallowip=127.0.0.1

# RPC information
# THIS MUST BE CHANGED FOR YOUR SECURITY
rpcuser=username
rpcpassword=passssssssss_new

# Mining is initially disabled
# gen=0
...

Java RPCClient que uso:

import java.io.IOException;
import java.util.Arrays;
import java.util.List;
import java.util.UUID;

import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.ParseException;
import org.apache.http.auth.AuthScope;
import org.apache.http.auth.UsernamePasswordCredentials;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.util.EntityUtils;
import org.json.simple.JSONArray;
import org.json.simple.JSONObject;
import org.json.simple.parser.JSONParser;

public class RPCClient {

    private static final String COMMAND_GET_BALANCE = "getbalance";
    private static final String COMMAND_GET_INFO = "getinfo";
    private static final String COMMAND_GET_NEW_ADDRESS = "getnewaddress";

    private JSONObject invokeRPC(String id, String method, List<String> params) {

//      CloseableHttpClient httpclient = HttpClientBuilder.create().build();
//      
//      httpclient.getCredentialsProvider();
        DefaultHttpClient httpclient = new DefaultHttpClient();

        JSONObject json = new JSONObject();
        json.put("id", id);
        json.put("method", method);
        if (null != params) {
            JSONArray array = new JSONArray();
            array.addAll(params);
            json.put("params", params);
        }
        JSONObject responseJsonObj = null;
        try {
            httpclient.getCredentialsProvider().setCredentials(new AuthScope("198.154.*.*", 34907),
                    new UsernamePasswordCredentials("username", "passssssssss_new"));
            StringEntity myEntity = new StringEntity(json.toJSONString());
            System.out.println(json.toString());
            HttpPost httppost = new HttpPost("http://198.154.*.*:34907");
            httppost.setEntity(myEntity);

            System.out.println("executing request" + httppost.getRequestLine());
            HttpResponse response = httpclient.execute(httppost);
            HttpEntity entity = response.getEntity();

            System.out.println("----------------------------------------");
            System.out.println(response.getStatusLine());
            if (entity != null) {
                System.out.println("Response content length: " + entity.getContentLength());
                // System.out.println(EntityUtils.toString(entity));
            }
            JSONParser parser = new JSONParser();
            responseJsonObj = (JSONObject) parser.parse(EntityUtils.toString(entity));
        } catch (ClientProtocolException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (ParseException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (org.json.simple.parser.ParseException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } finally {
            // When HttpClient instance is no longer needed,
            // shut down the connection manager to ensure
            // immediate deallocation of all system resources
            httpclient.getConnectionManager().shutdown();
        }
        return responseJsonObj;
    }

    public Double getBalance(String account) {
        String[] params = { account };
        JSONObject json = invokeRPC(UUID.randomUUID().toString(), COMMAND_GET_BALANCE, Arrays.asList(params));
        return (Double)json.get("result");
    }

    public String getNewAddress(String account) {
        String[] params = { account };
        JSONObject json = invokeRPC(UUID.randomUUID().toString(), COMMAND_GET_NEW_ADDRESS, Arrays.asList(params));
        return (String)json.get("result");
    }

    public JSONObject getInfo() {
        JSONObject json = invokeRPC(UUID.randomUUID().toString(), COMMAND_GET_INFO, null);
        return (JSONObject)json.get("result");
    }

    public JSONObject getInfo(String command) {
        JSONObject json = invokeRPC(UUID.randomUUID().toString(), command, null);
        return (JSONObject)json.get("result");
    }

    /*public static void main(String[] args) {
        System.out.println(new RPCClient().getInfo());      
    }*/
}

resultado actual:

{"id":"60f910c6-a893-4753-a9d3-cbe6973ccb14","method":"getinfo"}
executing requestPOST http://198.154.*.*:34907 HTTP/1.1
----------------------------------------
HTTP/1.1 403 Forbidden
Response content length: 0
Unexpected token END OF FILE at position 0.
    at org.json.simple.parser.JSONParser.parse(JSONParser.java:257)
    at org.json.simple.parser.JSONParser.parse(JSONParser.java:81)
    at org.json.simple.parser.JSONParser.parse(JSONParser.java:75)
    at RPCClient.invokeRPC(RPCClient.java:61)
    at RPCClient.getInfo(RPCClient.java:96)
    at KeccakTest.main(KeccakTest.java:125)
Exception in thread "main" java.lang.RuntimeException: java.lang.NullPointerException
    at KeccakTest.main(KeccakTest.java:129)
Caused by: java.lang.NullPointerException
    at RPCClient.getInfo(RPCClient.java:97)
    at KeccakTest.main(KeccakTest.java:125)
Veo una llamada POST en 198.154 .*.*:34907, ¿qué es esto? Si intenta acceder a bitcoind desde otro host, debe configurar rpcallowip=THE_OTHER_HOSTS_IP(o una máscara de IP para permitir el acceso a toda la subred, o rpcallowip=*para permitir todas las IP). Además, el puerto estándar para la red principal es 8332 y 18332 para testnet.
@George Kimionis, "198.154.xxx.xxx" es la ip del servidor, 34907 - puerto para conexiones JSON-RPC.
Bien, ¿intentaste configurar rpcallowip=*? Agregue la configuración que está utilizando dentro del RPCClient.javaarchivo a su pregunta.
@George Kimionis, ¡gracias! "rpcallowip=*" fue útil.

Respuestas (1)

En esta línea:

        HttpPost httppost = new HttpPost("http://198.154.*.*:34907");

la dirección 198.154.*.*no es una sintaxis de dirección IP válida. Si así es realmente como se ve su código fuente, entonces necesita usar una dirección IP completa y válida que sea solo números (por ejemplo, 198.154.1.1o lo que sea apropiado para su red).

Incluso si está ocultando deliberadamente su dirección IP para nosotros, todavía tiene un problema porque configuró rpcallowip=127.0.0.1lo que solo permite que esa dirección se comunique con el servidor RPC. Agregue otra rpcallowiplínea que contenga la dirección de la máquina donde está ejecutando este código Java.

HttpPost httppost = new HttpPost(" 198.154 .*.*:34907"); - He ocultado la dirección IP completa. Hay números en lugar de "*".