go json rpc

作者: ebayboy | 来源:发表于2018-06-21 14:02 被阅读0次

    //server.go

    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.go

    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)

    }

    相关文章

      网友评论

        本文标题:go json rpc

        本文链接:https://www.haomeiwen.com/subject/wdwxyftx.html