сообщение http через java в биткойн не работает

Я использую Ubuntu Server 12.04. Мой файл *.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, который я использую:

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());      
    }*/
}

Текущий результат:

{"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)
Я вижу вызов POST на 198.154 .*.*:34907, что это? Если вы пытаетесь получить доступ к биткойну с другого хоста, вы должны установить rpcallowip=THE_OTHER_HOSTS_IP(либо IP-маску, чтобы разрешить доступ ко всей подсети, либо rpcallowip=*разрешить все IP-адреса). Также стандартный порт для основной сети — 8332 и 18332 для тестовой сети.
@George Kimionis, «198.154.xxx.xxx» — это IP-адрес сервера, 34907 — порт для соединений JSON-RPC.
Хорошо, так что вы пытались установить rpcallowip=*? Пожалуйста, добавьте конфигурацию, которую вы используете внутри RPCClient.javaфайла, к вашему вопросу.
@ Джордж Кимионис, спасибо! "rpcallowip=*" было полезно.

Ответы (1)

В этой строке:

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

адрес 198.154.*.*не является допустимым синтаксисом IP-адреса. Если ваш исходный код действительно выглядит так, вам нужно использовать полный действительный IP-адрес, состоящий из цифр (например, 198.154.1.1или любой другой, подходящий для вашей сети).

Даже если вы намеренно скрываете от нас свой IP-адрес, у вас все еще есть проблема, потому что вы установили, rpcallowip=127.0.0.1что только этот адрес может взаимодействовать с RPC-сервером. Добавьте еще одну rpcallowipстроку, содержащую адрес машины, на которой выполняется этот код Java.

HttpPost httppost = новый HttpPost(" 198.154 .*.*:34907"); - Я скрыл полный IP-адрес. Вместо "*" стоят цифры.