go json rpc

//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)

}

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 01.{ 换行: Opening Brace Can't Be Placed on a Separate Lin...
    码农不器阅读 2,478评论 0 14
  • fmt格式化字符串 格式:%[旗标][宽度][.精度][arg索引]动词旗标有以下几种:+: 对于数值类型总是输出...
    皮皮v阅读 1,223评论 0 3
  • Lua 5.1 参考手册 by Roberto Ierusalimschy, Luiz Henrique de F...
    苏黎九歌阅读 14,257评论 0 38
  • 谈到docker源码,其实网上有很多的源码的分析的文章,也看过一些大牛写的docker源码解读的文章,收获很大。我...
    跨界师阅读 1,443评论 2 3
  • consul agent 分client server client 一般部署在靠近应用的地方,甚至本机用于对应用...
    wwq2020阅读 3,833评论 0 0

友情链接更多精彩内容