gpt4 book ai didi

node.js - 编写服务端实现RPC客户端Node.js

转载 作者:行者123 更新时间:2023-12-05 02:44:17 32 4
gpt4 key购买 nike

我使用 Go 实现了 RPC 服务器。现在,我想使用 Node.js 编写客户端,如何从 Node.js 客户端向 Go 服务器进行 RPC 调用。

这是用 Go 编写的服务器代码。

server.go

package main

type HelloService struct{}

func (p *HelloService) Hello(request string, reply *string) error {
*reply = "Hello " + request
return nil
}

func main() {
rpc.RegisterName("HelloService", new(HelloService))

// run rpc on port 1234
listener, err := net.Listen("tcp", ":1234")

if err != nil {
log.Fatal("ListenTCP error: ", err)
}

// use for-while for serve client
for {
conn, err := listener.Accept()
log.Println("New connection: ", conn)

if err != nil {
log.Fatal("Accept error: ", err)
}

go rpc.ServeConn(conn)
}
}

最佳答案

net/rpc包使用 encoding/gob作为默认的有线格式。它是一种 Go 特定的二进制序列化格式,它很高效,但在实践中,仅在 Go 应用程序之间进行通信时才有用。

但是,net/rpc 支持使用不同的编解码器来(反)序列化数据和 net/rpc/jsonrpc包提供了一个 JSON-RPC 1.0 兼容的编解码器实现。

这是一个使用它的示例,以及一个使用 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

请注意,net/rpc 包不再接受新功能,因此您最好使用 gRPC 之类的东西来获得更多功能和更好的跨语言兼容性。

关于node.js - 编写服务端实现RPC客户端Node.js,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66524733/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com