您的位置:首页 > 编程语言 > Go语言

Go语言学习之JSON RPC

2017-06-21 20:56 309 查看

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)

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  go语言 json struct os