在写入服务器的情况下实现 RPC 客户端节点.js

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


这是用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)

    }

}

 


拉丁的传说
浏览 177回答 1
1回答

慕桂英4014372

net/rpc 软件包使用编码/gob 作为默认的导线格式。它是一种特定于 Go 的二进制序列化格式,非常高效,但实际上,仅在 Go 应用程序之间进行通信时才有用。但是,支持对数据使用不同的编解码器进行(反)序列化,并且 net/rpc/jsonrpc 包提供了 JSON-RPC 1.0 投诉编解码器实现。net/rpc下面是一个使用它的示例,以及一个使用 jayson 包的 Node.js 客户端(没有什么特别的,只是我偶然发现的第一个支持 JSON-RPC 1.0 的客户端):server.gopackage mainimport (        "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.jsconst 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.go2021/03/12 06:46:21 New connection: 172.17.0.3:51016$ node client.jsresponse: Hello chuckx请注意,该软件包不再接受新功能,因此最好使用gRPC之类的东西来获得更多功能和更好的跨语言兼容性。net/rpc
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go