PHP中高级工程师面试重点讲解视频课程
Go快速入门浅显易懂视频教程-基础篇
Go快速入门浅显易懂视频教程-中级篇
go实现json格式的rpc服务
阅读:2116 分享次数:0

 //JSON RPC 方式
//jsonrpc方式是数据编码采用了json,而不是gob编码。
package main

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

//注意字段必须是导出
type Params struct {
    Width, Height int
}

type Rect struct{}

func (r *Rect) Area(p Params, ret *int) error {
    *ret = p.Width * p.Height
    return nil
}

func (r *Rect) Perimeter(p Params, ret *int) error {
    *ret = (p.Width + p.Height) * 2
    return nil
}

func chkError(err error) {
    if err != nil {
        log.Fatal(err)
    }
}

func main() {
    rect := new(Rect)
    //注册rpc服务
    rpc.Register(rect)
    //获取tcpaddr
    tcpaddr, err := net.ResolveTCPAddr("tcp4", "127.0.0.1:8080")
    chkError(err)
    //监听端口
    tcplisten, err2 := net.ListenTCP("tcp", tcpaddr)
    chkError(err2)
    for {
        conn, err3 := tcplisten.Accept()
        if err3 != nil {
            continue
        }
        //使用goroutine单独处理rpc连接请求
        //这里使用jsonrpc进行处理
        go jsonrpc.ServeConn(conn)
    }
}


//客户端

package main

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

type Params struct {
    Width, Height int
}

func main() {
    //连接远程rpc服务
    //这里使用jsonrpc.Dial
    rpc, err := jsonrpc.Dial("tcp", "127.0.0.1:8080")
    if err != nil {
        log.Fatal(err)
    }
    ret := 0
    //调用远程方法
    //注意第三个参数是指针类型
    err2 := rpc.Call("Rect.Area", Params{30, 100}, &ret)
    if err2 != nil {
        log.Fatal(err2)
    }
    fmt.Println(ret)
    err3 := rpc.Call("Rect.Perimeter", Params{30, 100}, &ret)
    if err3 != nil {
        log.Fatal(err3)
    }
    fmt.Println(ret)
}

感觉本站内容不错,读后有收获?