golang版本的json协议的rpc服务

前面两篇文章,数据传输都是用的gob编码,这次我们以json来举例.

服务端代码 :

package main

import (
	"net/rpc"
	"net"
	"log"
	"net/rpc/jsonrpc"
)

//自己的数据类
type MyMath struct{
	
}

//加法--只能两个参数
func (mm *MyMath) Add(num map[string]int,reply *int) error {
    *reply = num["num1"] + num["num2"]
    return nil
}

//减法--只能两个参数
func (mm *MyMath) Sub(num map[string]int,reply *int) error {
    *reply = num["num1"] - num["num2"]
    return nil
}

func main() {
	//注册MyMath类,以代客户端调用
    rpc.Register(new(MyMath))
    listener, err := net.Listen("tcp", ":1215")
    if err != nil {
        log.Fatal("listen error:", err)
    }
    for {
        conn, err := listener.Accept()
        if err != nil {
            continue
        }
		//新协程来处理--json
        go jsonrpc.ServeConn(conn)
    }
}

客户端代码:

package main

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

func main() {
	//连接服务--json
    client, err := jsonrpc.Dial("tcp", "127.0.0.1:1215")
    if err != nil {
        log.Fatal("dialing:", err)
    }
    var reply int
	var num = make(map[string]int)
	num["num1"] = 3
	num["num2"] = 2
	//调用远程MyMath的Add方法,也只能是三个参数
    err = client.Call("MyMath.Add",num,&reply)
    if err != nil {
        log.Fatal("arith error:", err)
    }
	//输出结果
    fmt.Println(reply)
	//调用远程MyMath的Sub方法,也只能是三个参数
	err = client.Call("MyMath.Sub",num,&reply)
    if err != nil {
        log.Fatal("arith error:", err)
    }
	//输出结果
    fmt.Println(reply)
	client.Close()
}

这样,我们基本对go语言http,tcp,json三个协议的rpc服务有了一个基本的了解.

此条目发表在 网站开发 分类目录,贴了 , 标签。将固定链接加入收藏夹。

评论功能已关闭。