JSON RPC 连接被拒绝 / PHP


JSON RPC Connection refused / PHP?

我使用本教程配置和设置了莱特币守护进程(它与比特币守护进程相同): https://forum.litecoin.net/index.php?topic=43.0

一切都很好,但是,当我尝试通过下面的代码远程向其发送命令时(thesite.com 替换为我的实际IP,与user:pass相同)

    $litecoin = new jsonRPCClient('http://user:pass@thesite.com:8332/');
    echo $litecoin->getinfo();

在我的莱特币.conf文件中,我有:

rpcallowip=1.1.1.1
rpcallowport=8332
server=1
daemon=1
rpcuser=user
rpcpassword=pass

它返回此错误:

警告:fopen(http://...@thesite.com:8332/):无法打开流:第 132 行的/var/www/html/gawk/jsonRPCClient.php 中的连接被拒绝 致命错误:未捕获的异常"异常",并在/var/www/html/gawk/jsonRPCClient.php:140 中显示消息"无法连接到 http://user:pass@thesite.com:8332/" 堆栈跟踪:#0/var/www/html/gawk/index.php(27):

jsonRPCClient->__call('getinfo', Array) #1/var/www/html/gawk/index.php(27): jsonRPCClient->getinfo() #2 {main} throw in/var/www/html/gawk/jsonRPCClient.php on line 140

当我在本地发送命令(从托管守护程序的服务器)时,它可以工作,但我需要能够远程发送命令。

我正在使用下面的 JSON-RPC 类:

<?php
/*
                    COPYRIGHT
Copyright 2007 Sergio Vaccaro <sergio@inservibile.org>
This file is part of JSON-RPC PHP.
JSON-RPC PHP is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
JSON-RPC PHP is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with JSON-RPC PHP; if not, write to the Free Software
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
*/
/**
 * The object of this class are generic jsonRPC 1.0 clients
 * http://json-rpc.org/wiki/specification
 *
 * @author sergio <jsonrpcphp@inservibile.org>
 */
class jsonRPCClient {
    /**
     * Debug state
     *
     * @var boolean
     */
    private $debug;
    /**
     * The server URL
     *
     * @var string
     */
    private $url;
    /**
     * The request id
     *
     * @var integer
     */
    private $id;
    /**
     * If true, notifications are performed instead of requests
     *
     * @var boolean
     */
    private $notification = false;
    /**
     * Takes the connection parameters
     *
     * @param string $url
     * @param boolean $debug
     */
    public function __construct($url,$debug = false) {
        // server URL
        $this->url = $url;
        // proxy
        empty($proxy) ? $this->proxy = '' : $this->proxy = $proxy;
        // debug state
        empty($debug) ? $this->debug = false : $this->debug = true;
        // message id
        $this->id = 1;
    }
    /**
     * Sets the notification state of the object. In this state, notifications are performed, instead of requests.
     *
     * @param boolean $notification
     */
    public function setRPCNotification($notification) {
        empty($notification) ?
                            $this->notification = false
                            :
                            $this->notification = true;
    }
    /**
     * Performs a jsonRCP request and gets the results as an array
     *
     * @param string $method
     * @param array $params
     * @return array
     */
    public function __call($method,$params) {
        // check
        if (!is_scalar($method)) {
            throw new Exception('Method name has no scalar value');
        }
        // check
        if (is_array($params)) {
            // no keys
            $params = array_values($params);
        } else {
            throw new Exception('Params must be given as array');
        }
        // sets notification or request task
        if ($this->notification) {
            $currentId = NULL;
        } else {
            $currentId = $this->id;
        }
        // prepares the request
        $request = array(
                        'method' => $method,
                        'params' => $params,
                        'id' => $currentId
                        );
        $request = json_encode($request);
        $this->debug && $this->debug.='***** Request *****'."'n".$request."'n".'***** End Of request *****'."'n'n";
        // performs the HTTP POST
        $opts = array ('http' => array (
                            'method'  => 'POST',
                            'header'  => 'Content-type: application/json',
                            'content' => $request
                            ));
        $context  = stream_context_create($opts);
        if ($fp = fopen($this->url, 'r', false, $context)) {
            $response = '';
            while($row = fgets($fp)) {
                $response.= trim($row)."'n";
            }
            $this->debug && $this->debug.='***** Server response *****'."'n".$response.'***** End of server response *****'."'n";
            $response = json_decode($response,true);
        } else {
            throw new Exception('Unable to connect to '.$this->url);
        }
        // debug output
        if ($this->debug) {
            echo nl2br($debug);
        }
        // final checks and return
        if (!$this->notification) {
            // check
            if ($response['id'] != $currentId) {
                throw new Exception('Incorrect response id (request id: '.$currentId.', response id: '.$response['id'].')');
            }
            if (!is_null($response['error'])) {
                throw new Exception('Request error: '.$response['error']);
            }
            return $response['result'];
        } else {
            return true;
        }
    }
}
?>

有谁知道可能出了什么问题?

更改此代码:

rpcallowip=1.1.1.1

但请注意,暴露端口会带来安全问题。从配置文档中:

# By default, only RPC connections from localhost are allowed.  Specify
# as many rpcallowip= settings as you like to allow connections from
# other hosts (and you may use * as a wildcard character).
# NOTE: opening up the RPC port to hosts outside your local
# trusted network is NOT RECOMMENDED, because the rpcpassword
# is transmitted over the network unencrypted.