go &PHPjson-rpc通信
Go & PHP json-rpc communication
我尝试在 php 和 go 之间通信 JSON-RPC。
此示例中的服务器 GO https://golang.org/pkg/net/rpc/
package main
import (
"errors"
"net/rpc"
"net"
"log"
"net/http"
)
type Args struct {
A, B int
}
type Quotient struct {
Quo, Rem int
}
type Arith int
func (t *Arith) Multiply(args *Args, reply *int) error {
*reply = args.A * args.B
return nil
}
func (t *Arith) Divide(args *Args, quo *Quotient) error {
if args.B == 0 {
return errors.New("divide by zero")
}
quo.Quo = args.A / args.B
quo.Rem = args.A % args.B
return nil
}
func main() {
arith := new(Arith)
rpc.Register(arith)
rpc.HandleHTTP()
l, e := net.Listen("tcp", ":4444")
if e != nil {
log.Fatal("listen error:", e)
}
// go http.Serve(l, nil)
err:= http.Serve(l, nil)
if err != nil {
log.Fatalf("Error serving: %s", err)
}
}
和 php 来自此存储库示例的客户端 https://github.com/ptcx/jsonrpc-client:
require 'vendor/autoload.php';
$client = new JRClient\Client('tcp', '127.0.0.1:4444');
sleep(5);
$result = $client->call('Arith.Multiply', ['A' => 3, "B" => 4], 1000);
if ($result['error']) {
echo $result['errorMsg'] . "\n";
} else {
var_dump($result['data']);
}
Bur 最后我有错误:HTTP/1.1 400 Bad Request
我也尝试在 php 连接后写 sleep(5)
但没有结果?我还尝试从 false
上的 true
更改为函数 stream_set_blocking($this->sockfp, false)
https://github.com/ptcx/jsonrpc-client/blob/master/src/Connection/TcpConnection.php#L69 - 没有结果。
我尝试编写 GO 客户端 - 它可以正常工作。
请帮助我 php 客户
当您调用 rpc.HandleHTTP()
时,您正在使用 gobs 编码和解码。阅读更多关于采空区的信息:https://blog.golang.org/gobs-of-data and https://golang.org/pkg/encoding/gob/.
在文件 https://golang.org/src/net/rpc/server.go 中,您可以阅读以下内容:
要在 Go 中使用 jsonrpc,您必须使用包 net/rpc/jsonrpc 中的编解码器而不是 net/rpc。
Package jsonrpc implements a JSON-RPC 1.0 ClientCodec and ServerCodec
for the rpc package. For JSON-RPC 2.0 support [...]
(Ref. source: https://golang.org/pkg/net/rpc/jsonrpc/)
所以上面遵循 main.go 中的代码:
func main() {
//arith instance
arith := new(Arith)
//make listen in 127.0.0.1:4444
l, e := net.Listen("tcp", ":4444")
if e != nil {
log.Fatal("listen error:", e)
}
defer l.Close()
//instance rpc server
rpcserver := rpc.NewServer()
rpcserver.Register(arith)
//updated for multiples requests
for {
//block until acceptation of client
c, e := l.Accept()
if e != nil {
log.Fatal("accept error:", e)
}
//instance codec
jsoncodec := jsonrpc.NewServerCodec(c)
rpcserver.ServeCodec(jsoncodec)
}
}
执行 php client.php
结果是:
更新:在 php 文件中:
<?php
//imports
require 'vendor/autoload.php';
//instance client
$client = new JRClient\Client('tcp', '127.0.0.1:4444');
//sleep(5); <<-- remove
//call method 'Arith.Multiply'
$result = $client->call('Arith.Multiply', ['A' => 3, "B" => 4], 1000);
if ($result['error']) {
echo $result['errorMsg'] . "\n";
} else {
var_dump($result['data']);
}
?>
希望对您有所帮助!!
我尝试在 php 和 go 之间通信 JSON-RPC。
此示例中的服务器 GO https://golang.org/pkg/net/rpc/
package main
import (
"errors"
"net/rpc"
"net"
"log"
"net/http"
)
type Args struct {
A, B int
}
type Quotient struct {
Quo, Rem int
}
type Arith int
func (t *Arith) Multiply(args *Args, reply *int) error {
*reply = args.A * args.B
return nil
}
func (t *Arith) Divide(args *Args, quo *Quotient) error {
if args.B == 0 {
return errors.New("divide by zero")
}
quo.Quo = args.A / args.B
quo.Rem = args.A % args.B
return nil
}
func main() {
arith := new(Arith)
rpc.Register(arith)
rpc.HandleHTTP()
l, e := net.Listen("tcp", ":4444")
if e != nil {
log.Fatal("listen error:", e)
}
// go http.Serve(l, nil)
err:= http.Serve(l, nil)
if err != nil {
log.Fatalf("Error serving: %s", err)
}
}
和 php 来自此存储库示例的客户端 https://github.com/ptcx/jsonrpc-client:
require 'vendor/autoload.php';
$client = new JRClient\Client('tcp', '127.0.0.1:4444');
sleep(5);
$result = $client->call('Arith.Multiply', ['A' => 3, "B" => 4], 1000);
if ($result['error']) {
echo $result['errorMsg'] . "\n";
} else {
var_dump($result['data']);
}
Bur 最后我有错误:HTTP/1.1 400 Bad Request
我也尝试在 php 连接后写 sleep(5)
但没有结果?我还尝试从 false
上的 true
更改为函数 stream_set_blocking($this->sockfp, false)
https://github.com/ptcx/jsonrpc-client/blob/master/src/Connection/TcpConnection.php#L69 - 没有结果。
我尝试编写 GO 客户端 - 它可以正常工作。
请帮助我 php 客户
当您调用 rpc.HandleHTTP()
时,您正在使用 gobs 编码和解码。阅读更多关于采空区的信息:https://blog.golang.org/gobs-of-data and https://golang.org/pkg/encoding/gob/.
在文件 https://golang.org/src/net/rpc/server.go 中,您可以阅读以下内容:
要在 Go 中使用 jsonrpc,您必须使用包 net/rpc/jsonrpc 中的编解码器而不是 net/rpc。
Package jsonrpc implements a JSON-RPC 1.0 ClientCodec and ServerCodec for the rpc package. For JSON-RPC 2.0 support [...]
(Ref. source: https://golang.org/pkg/net/rpc/jsonrpc/)
所以上面遵循 main.go 中的代码:
func main() {
//arith instance
arith := new(Arith)
//make listen in 127.0.0.1:4444
l, e := net.Listen("tcp", ":4444")
if e != nil {
log.Fatal("listen error:", e)
}
defer l.Close()
//instance rpc server
rpcserver := rpc.NewServer()
rpcserver.Register(arith)
//updated for multiples requests
for {
//block until acceptation of client
c, e := l.Accept()
if e != nil {
log.Fatal("accept error:", e)
}
//instance codec
jsoncodec := jsonrpc.NewServerCodec(c)
rpcserver.ServeCodec(jsoncodec)
}
}
执行 php client.php
结果是:
更新:在 php 文件中:
<?php
//imports
require 'vendor/autoload.php';
//instance client
$client = new JRClient\Client('tcp', '127.0.0.1:4444');
//sleep(5); <<-- remove
//call method 'Arith.Multiply'
$result = $client->call('Arith.Multiply', ['A' => 3, "B" => 4], 1000);
if ($result['error']) {
echo $result['errorMsg'] . "\n";
} else {
var_dump($result['data']);
}
?>
希望对您有所帮助!!