golang 处理json(golang的jsonrpc客户端通用写法)
导读:服务端 package main import (...
服务端
package main import ( "errors" "fmt" "log" "net" "net/rpc" "net/rpc/jsonrpc" "os" ) // 算数运算结构体 type Arith struct { } // 算数运算请求结构体 type ArithRequest struct { A int B int } // 算数运算响应结构体 type ArithResponse struct { Pro int // 乘积 Quo int // 商 Rem int // 余数 } // 乘法运算方法 func (this *Arith) Multiply(req ArithRequest, res *ArithResponse) error { res.Pro = req.A * req.B return nil } // 除法运算方法 func (this *Arith) Divide(req ArithRequest, res *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服务 lis, err := net.Listen("tcp", "127.0.0.1:8096") if err != nil { log.Fatalln("fatal error: ", err) } fmt.Fprintf(os.Stdout, "%s", "start connection") for { conn, err := lis.Accept() // 接收客户端连接请求 if err != nil { continue } go func(conn net.Conn) { // 并发处理客户端请求 fmt.Fprintf(os.Stdout, "%s", "new client in coming\n") jsonrpc.ServeConn(conn) }(conn) } }go标准库客户端
package main import ( "fmt" "log" "net/rpc/jsonrpc" ) // 算数运算请求结构体 type ArithRequest struct { A int B int } // 算数运算响应结构体 type ArithResponse struct { Pro int // 乘积 Quo int // 商 Rem int // 余数 } func main() { conn, err := jsonrpc.Dial("tcp", "127.0.0.1:8096") if err != nil { log.Fatalln("dailing error: ", err) } req := ArithRequest{9, 2} var res 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) }通用客户端
主要是下面这种方式 ,其他任何语言都可以使用tcp封装入参和并且解析返回数据 ,因为入参和返回值都可以通过json进行解析
package main import ( "encoding/json" "fmt" "net" ) func main() { err := f() if err != nil { panic(err) } } func f() error { c, err := net.Dial("tcp", "127.0.0.1:8096") if err != nil { return err } defer c.Close() type clientRequest struct { Method string `json:"method"` Params [1]any `json:"params"` Id uint64 `json:"id"` } b, err := json.Marshal(clientRequest{ Method: "Arith.Divide", Params: [1]any{json.RawMessage(`{"A":123,"B":31}`)}, Id: 1, }) if err != nil { return err } _, err = c.Write(b) if err != nil { return err } var clientResponse struct { Id uint64 `json:"id"` Result *json.RawMessage `json:"result"` Error any `json:"error"` } err = json.NewDecoder(c).Decode(&clientResponse) if err != nil { return err } fmt.Println(clientResponse) var ArithResponse struct { Pro int // 乘积 Quo int // 商 Rem int // 余数 } err = json.Unmarshal(*clientResponse.Result, &ArithResponse) if err != nil { return err } fmt.Println(ArithResponse) return nil }创心域SEO版权声明:以上内容作者已申请原创保护,未经允许不得转载,侵权必究!授权事宜、对本内容有异议或投诉,敬请联系网站管理员,我们将尽快回复您,谢谢合作!