本文最后由 森林生灵 于 2020/07/11 10:27:26 编辑
客户端调用服务端
server.go
package main import ( "log" "net" "net/http" "net/rpc" "net/rpc/jsonrpc" ) type Args struct { A int B int } type Number struct{} // 方法参数列表必须为此格式 func (num *Number) Sum(args *Args, sum *int) error { *sum = args.A + args.B return nil } func TcpServer() { ln, err := net.Listen("tcp", "127.0.0.1:9008") if err != nil { log.Fatalln("net.Listen error:", err) } log.Println("start connection") for { // 接收客户端连接请求 conn, err := ln.Accept() if err != nil { log.Println("ln.Accept error:", err) continue } // 处理客户端请求 go func(conn net.Conn) { log.Println("new client in coming") jsonrpc.ServeConn(conn) }(conn) } } func HttpServer() { rpc.HandleHTTP() ln, err := net.Listen("tcp", "127.0.0.1:9009") if err != nil { log.Fatalln("net.Listen error:", err) } err = http.Serve(ln, nil) if err != nil { log.Fatalln("http.Serve error:", err) } } func main() { err := rpc.Register(&Number{}) if err != nil { log.Fatalln("rpc.Register error:", err) } go TcpServer() go HttpServer() select {} }
client.go
package main import ( "log" "net/rpc" "net/rpc/jsonrpc" "time" ) type Args struct { A int B int } func Tcp() { client, err := jsonrpc.Dial("tcp", "127.0.0.1:9008") if err != nil { log.Fatalln("jsonrpc.Dial error:", err) } args := &Args{9, 2} var sum int // 调用方法 err = client.Call("Number.Sum", args, &sum) if err != nil { log.Fatalln("conn.Call error:", err) } log.Println("Tcp result:", sum) } func Http() { client, err := rpc.DialHTTP("tcp", "127.0.0.1:9009") if err != nil { log.Fatalln("jsonrpc.Dial error:", err) } args := &Args{9, 2} var sum int // 调用方法 err = client.Call("Number.Sum", args, &sum) if err != nil { log.Fatalln("conn.Call error:", err) } log.Println("Http result:", sum) } func Async() { client, err := jsonrpc.Dial("tcp", "127.0.0.1:9008") // client, err := rpc.DialHTTP("tcp", "127.0.0.1:9009") if err != nil { log.Fatalln("jsonrpc.Dial error:", err) } args := &Args{9, 2} var sum int call := client.Go("Number.Sum", args, &sum, nil) <-call.Done log.Println("Async result:", sum) } func main() { go Tcp() go Http() go Async() <-time.After(time.Second) }
服务端调用客户端(反向 RPC)
server.go
package main import ( "log" "net" "net/rpc" ) type Args struct { A int B int } func TcpServer() { ln, err := net.Listen("tcp", "127.0.0.1:9008") if err != nil { log.Fatalln("net.Listen error:", err) } for { // 监听客户端连接 conn, err := ln.Accept() if err != nil { log.Println("ln.Accept error:", err) continue } // 调用客户端方法 go func(conn net.Conn) { log.Println("new client in coming") client := rpc.NewClient(conn) args := &Args{9, 2} var sum int // 调用方法 err = client.Call("Calc.Sum", args, &sum) if err != nil { log.Println("conn.Call error:", err) } log.Println("result:", sum) }(conn) } } func main() { TcpServer() }
client.go
package main import ( "log" "net" "net/rpc" ) type Args struct { A int B int } type Number struct{} // 方法参数列表必须为此格式 func (num *Number) Sum(args *Args, sum *int) error { *sum = args.A + args.B return nil } func main() { // 注册服务 err := rpc.RegisterName("Calc", new(Number)) if err != nil { log.Fatalln("rpc.Register error:", err) } for { conn, err := net.Dial("tcp", "127.0.0.1:9008") if err != nil { log.Fatalln("rpc.Dial error:", err) } rpc.ServeConn(conn) conn.Close() } }
本文标题:golang rpc demo
版权声明:本文使用「署名-非商业性使用-相同方式共享」创作共享协议,转载或使用请遵守署名协议。
相关文章
上一篇:golang 反射的使用