Go语言学习之JSON RPC

server

package main

import (
    "errors"
    "fmt"
    "net"
    "net/rpc"
    "net/rpc/jsonrpc"
    "os"
)

type Args struct {
    A, B int
}

func checkError(err error) {
    if err != nil {
        fmt.Fprint(os.Stderr, "Usage: %s", err.Error())
        os.Exit(1)
    }
}

type Quotient struct {
    Quo, Rem int
}

type Arith int

func (t *Arith) Muliply(args *Args, reply *int) error {
    *reply = args.A * args.B
    return nil
}

func (t *Arith) Divide(args *Args, quo *Quotient) error {
    if args.B == 0 {
        return errors.New("divide by zero")
    }
    quo.Quo = args.A * args.B
    quo.Rem = args.A / args.B
    return nil
}

func main() {
    arith := new(Arith)
    rpc.Register(arith)

    tcpAddr, err := net.ResolveTCPAddr("tcp", ":1234")
    checkError(err)

    Listener, err := net.ListenTCP("tcp", tcpAddr)
    checkError(err)

    for {
        conn, err := Listener.Accept()
        if err != nil {
            fmt.Fprint(os.Stderr, "accept err: %s", err.Error())
            continue
        }
        jsonrpc.ServeConn(conn)
    }
}

client

package main

import (
    "fmt"
    "net/rpc/jsonrpc"
    "os"
)

type Args struct {
    A, B int
}

type quo struct {
    Quo, Rem int
}

func main() {
    service := "127.0.0.1:1234"
    client, err := jsonrpc.Dial("tcp", service)
    if err != nil {
        fmt.Println("dial error:", err)
        os.Exit(1)
    }

    args := Args{1, 2}
    var reply int
    err = client.Call("Arith.Muliply", args, &reply)
    if err != nil {
        fmt.Println("Arith.Muliply call error:", err)
        os.Exit(1)
    }
    fmt.Println("the arith.mutiply is :", reply)
    var quto quo
    err = client.Call("Arith.Divide", args, &quto)
    if err != nil {
        fmt.Println("Arith.Divide call error:", err)
        os.Exit(1)
    }
    fmt.Println("the arith.devide is :", quto.Quo, quto.Rem)

}

猜你喜欢

转载自blog.csdn.net/libinbin_1014/article/details/73555507