Go语言使用net库进行远程过程调用

文件结构:

│
├─rpc_client
│      rpc_client.go
│
├─rpc_protocol
│      rpc_protocol.go
│
└─rpc_server
        rpc_server.go
//rpc_protocol.go
package RpcProtocol

// 算数运算请求结构体
type ArithRequest struct {
        A int
        B int
}

// 算数运算响应结构体
type ArithResponse struct {
        Pro int // 乘积
        Quo int // 商
        Rem int // 余数
}

服务端

//rpc_server.go
package main

import (
        "errors"
        "fmt"
        "log"
        "net"
        "net/http"
        "net/rpc"
        "os"
        "net_rpc/rpc_protocol"
)

// 算数运算结构体
type Arith struct {
}

// 乘法运算方法
func (this *Arith) Multiply(req RpcProtocol.ArithRequest, res *RpcProtocol.ArithResponse) error {
        res.Pro = req.A * req.B
        return nil
}

// 除法运算方法
func (this *Arith) Divide(req RpcProtocol.ArithRequest, res *RpcProtocol.ArithResponse) error {
        if req.B == 0 {
                return errors.New("divide by zero")
        }
        res.Quo = req.A / req.B
        res.Rem = req.A % req.B
        return nil
}

func main() {
        rpc.Register(new(Arith)) // 注册rpc服务
        rpc.HandleHTTP()         // 采用http协议作为rpc载体

        lis, err := net.Listen("tcp", "127.0.0.1:8095")
        if err != nil {
                log.Fatalln("fatal error: ", err)
        }

        fmt.Fprintf(os.Stdout, "%s", "start connection")

        http.Serve(lis, nil)
}

客户端

//rpc_client.go
package main

import (
        "fmt"
        "log"
        "net/rpc"
        "net_rpc/rpc_protocol"
)

func main() {
        conn, err := rpc.DialHTTP("tcp", "127.0.0.1:8095")
        if err != nil {
                log.Fatalln("dailing error: ", err)
        }

        req := RpcProtocol.ArithRequest{9, 2}
        var res RpcProtocol.ArithResponse

        err = conn.Call("Arith.Multiply", req, &res) // 乘法运算
        if err != nil {
                log.Fatalln("arith error: ", err)
        }
        fmt.Printf("%d * %d = %d\n", req.A, req.B, res.Pro)

        err = conn.Call("Arith.Divide", req, &res)
        if err != nil {
                log.Fatalln("arith error: ", err)
        }
        fmt.Printf("%d / %d, quo is %d, rem is %d\n", req.A, req.B, res.Quo, res.Rem)
}