首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往
您找到你想要的搜索结果了吗?
是的
没有找到

go实现json格式的rpc服务

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

03

go实现http的rpc服务

//http的rpc服务 package main import ( "log" "net/http" "net/rpc" ) //go对RPC的支持,支持三个级别:TCP、HTTP、JSONRPC //go的RPC只支持GO开发的服务器与客户端之间的交互,因为采用了gob编码 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 main() { rect := new(Rect) //注册一个rect服务 rpc.Register(rect) //把服务处理绑定到http协议上 rpc.HandleHTTP() err := http.ListenAndServe(":8080", nil) if err != nil { log.Fatal(err) } } //客户端实现 package main import ( "fmt" "log" "net/rpc" ) type Params struct { Width, Height int } func main() { //连接远程rpc服务 rpc, err := rpc.DialHTTP("tcp", "127.0.0.1:8080") if err != nil { log.Fatal(err) } ret := 0 //调用远程方法,注意第三个三叔是指针类型 err = rpc.Call("Rect.Area", Params{30, 40}, &ret) if err != nil { log.Fatal(err) } fmt.Println(ret) err = rpc.Call("Rect.Perimeter", Params{30, 50}, &ret) if err != nil { log.Fatal(err) } fmt.Println(ret) }

02
领券