1 回答

TA貢獻(xiàn)1871條經(jīng)驗(yàn) 獲得超13個(gè)贊
net/rpc
軟件包使用編碼/gob
作為默認(rèn)的導(dǎo)線格式。它是一種特定于 Go 的二進(jìn)制序列化格式,非常高效,但實(shí)際上,僅在 Go 應(yīng)用程序之間進(jìn)行通信時(shí)才有用。
但是,支持對(duì)數(shù)據(jù)使用不同的編解碼器進(jìn)行(反)序列化,并且 net/rpc/jsonrpc
包提供了 JSON-RPC 1.0 投訴編解碼器實(shí)現(xiàn)。net/rpc
下面是一個(gè)使用它的示例,以及一個(gè)使用 jayson 包的 Node.js 客戶端(沒有什么特別的,只是我偶然發(fā)現(xiàn)的第一個(gè)支持 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);
});
輸出
服務(wù)器客戶端
$ go run server.go
2021/03/12 06:46:21 New connection: 172.17.0.3:51016
$ node client.js
response: Hello chuckx
請(qǐng)注意,該軟件包不再接受新功能,因此最好使用gRPC之類的東西來獲得更多功能和更好的跨語言兼容性。net/rpc
- 1 回答
- 0 關(guān)注
- 135 瀏覽
添加回答
舉報(bào)