1 回答
TA贡献1871条经验 获得超13个赞
net/rpc 软件包使用编码/gob 作为默认的导线格式。它是一种特定于 Go 的二进制序列化格式,非常高效,但实际上,仅在 Go 应用程序之间进行通信时才有用。
但是,支持对数据使用不同的编解码器进行(反)序列化,并且 net/rpc/jsonrpc 包提供了 JSON-RPC 1.0 投诉编解码器实现。net/rpc
下面是一个使用它的示例,以及一个使用 jayson 包的 Node.js 客户端(没有什么特别的,只是我偶然发现的第一个支持 JSON-RPC 1.0 的客户端):
server.go
package main
import (
"log"
"net"
"net/rpc"
"net/rpc/jsonrpc"
)
type HelloService struct{}
func (p *HelloService) Hello(request string, reply *string) error {
*reply = "Hello " + request
return nil
}
func main() {
rpc.RegisterName("HelloService", new(HelloService))
listener, err := net.Listen("tcp", ":1234")
if err != nil {
log.Fatal("ListenTCP error: ", err)
}
for {
conn, err := listener.Accept()
if err != nil {
log.Fatal("Accept error: ", err)
}
log.Printf("New connection: %+v\n", conn.RemoteAddr())
go jsonrpc.ServeConn(conn)
}
}
client.js
const jayson = require("jayson");
const client = jayson.client.tcp({
host: "172.17.0.2",
port: "1234",
version: 1,
});
client.request("HelloService.Hello", ["chuckx"], (err, response) => {
if (err) throw err;
if (response.error) throw response.error;
console.log("response:", response.result);
});
输出
服务器客户端
$ go run server.go
2021/03/12 06:46:21 New connection: 172.17.0.3:51016
$ node client.js
response: Hello chuckx
请注意,该软件包不再接受新功能,因此最好使用gRPC之类的东西来获得更多功能和更好的跨语言兼容性。net/rpc
- 1 回答
- 0 关注
- 176 浏览
添加回答
举报
