//基于tcp的RPC package main import ( "log" "net" "net/rpc" ) 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) //注册rpc服务 rpc.Register(rect) //获取tcpaddr tcpaddr, err := net.ResolveTCPAddr("tcp4", "127.0.0.1:8080") if err != nil { log.Fatal(err) } //监听端口 tcplisten, err := net.ListenTCP("tcp", tcpaddr) if err != nil { log.Fatal(err) } for { conn, err := tcplisten.Accept() if err != nil { continue } //使用go routine单独处理rpc连接请求 go rpc.ServeConn(conn) } } //客户端连接 package main import ( "log" "net/rpc" ) import ( "fmt" ) type Params struct { Width, Height int } func main() { //连接远程rpc服务 //这里使用Dial,http方式使用DialHTTP,其他代码都一样 rpc, err := rpc.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) }
go实现tcp的rpc服务
2022-04-25 08:36:34
浏览数 (1)