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

gostucd · · 1443 次点击
读写超时、保活等方式
#1
更多评论
我的php 调用GO标准库jsonRPC也是经常掉线,不知道原因 ### ip2city jsonRPC server代码 ```go 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客户端代码 ```php 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