请问,怎么判断rpc call 是否掉线

gostucd · 2018-03-27 11:06:00 · 1625 次点击

读写超时、保活等方式

#1
更多评论

我的php 调用GO标准库jsonRPC也是经常掉线,不知道原因

ip2city jsonRPC server代码

package main

import (
    "fmt"
    "github.com/oschwald/geoip2-golang"
    "log"
    "net"
    "net/rpc"
    "net/rpc/jsonrpc"
    "os"
)

type Response struct {
    Country   string
    Province  string
    City      string
    ISP       string
    Latitude  float64
    Longitude float64
    TimeZone  string
}

type Ip2addr struct {
    db *geoip2.Reader
}
type Agrs struct {
    IpString string
}

func (t *Ip2addr) Address(agr *Agrs, res *Response) error {
    netIp := net.ParseIP(agr.IpString)
    record, err := t.db.City(netIp)
    res.City = record.City.Names["zh-CN"]
    res.Province = record.Subdivisions[0].Names["zh-CN"]
    res.Country = record.Country.Names["zh-CN"]
    res.Latitude = record.Location.Latitude
    res.Longitude = record.Location.Longitude
    res.TimeZone = record.Location.TimeZone
    return err
}

func main() {
    db, err := geoip2.Open("./GeoLite2-City.mmdb")
    if err != nil {
        log.Fatal(err)
    }
    ip2addr := &Ip2addr{db}

    rpc.Register(ip2addr)
    address := ":3344"
    tcpAddr, err := net.ResolveTCPAddr("tcp", address)
    checkError(err)
    listener, err := net.ListenTCP("tcp", tcpAddr)
    checkError(err)
    log.Println("json rpc is listening", tcpAddr)
    for {
        conn, err := listener.Accept()
        if err != nil {
            continue
        }
        jsonrpc.ServeConn(conn)
    }

}

func checkError(err error) {
    if err != nil {
        fmt.Println("Fatal error ", err.Error())
        os.Exit(1)
    }
}

PHP JsonRPC客户端代码


class JsonRPC
{
    public $conn;

    function __construct($host, $port)
    {
        $this->conn = fsockopen($host, $port, $errno, $errstr, 3);
        if (!$this->conn) {
            return false;
        }
    }

    public function Call($method, $params)
    {
        $obj = new stdClass();
        $obj->code = 0;

        if (!$this->conn) {
            $obj->info = "jsonRPC-socket-tcp连接失败!";
            return $obj;
        }
        $err = fwrite($this->conn, json_encode(array(
                'method' => $method,
                'params' => array($params),
                'id' => 0,
            )) . "\n");
        if ($err === false) {
            fclose($this->conn);
            $obj->info = "jsonRPC发送参数失败!socket-tcp资源是否释放";
            return $obj;
        }

        stream_set_timeout($this->conn, 0, 3000);
        $line = fgets($this->conn);
        fclose($this->conn);
        if ($line === false) {
            $obj->info = "jsonRPC返回消息为空!请检查自己的rpc-client代码";
            return $obj;
        }
        $temp = json_decode($line);
        $obj->code = $temp->error == null ? 1 : 0;
        $obj->data = $temp->result;
        return $obj;
    }
}


function json_rpc_ip_address($ipString)
{
    //redis是后来加上的
    $redis = redis();
    $jsonString = $redis->hGet('ip_db', $ipString);
    if (empty($jsonString)) {
        $client = new JsonRPC("127.0.0.1", 3344);
        $obj = $client->Call("Ip2addr.Address", ['IpString' => $ipString]);
        if ($obj->code === 1) {
            $jsonString = json_encode($obj);
            $redis->hset('ip_db', $ipString, $jsonString);
            return $obj;
        }
    }
    return json_decode($jsonString);
}
#2