mirror of
https://github.com/geektutu/7days-golang.git
synced 2024-04-21 12:32:11 +00:00
58 lines
1.1 KiB
Go
58 lines
1.1 KiB
Go
package main
|
|
|
|
import (
|
|
"geerpc"
|
|
"log"
|
|
"net"
|
|
"sync"
|
|
"time"
|
|
)
|
|
|
|
type Foo int
|
|
|
|
type Args struct{ Num1, Num2 int }
|
|
|
|
func (f Foo) Sum(args Args, reply *int) error {
|
|
*reply = args.Num1 + args.Num2
|
|
return nil
|
|
}
|
|
|
|
func startServer(addr chan string) {
|
|
var foo Foo
|
|
if err := geerpc.Register(&foo); err != nil {
|
|
log.Fatal("register error:", err)
|
|
}
|
|
// pick a free port
|
|
l, err := net.Listen("tcp", ":0")
|
|
if err != nil {
|
|
log.Fatal("network error:", err)
|
|
}
|
|
log.Println("start rpc server on", l.Addr())
|
|
addr <- l.Addr().String()
|
|
geerpc.Accept(l)
|
|
}
|
|
|
|
func main() {
|
|
addr := make(chan string)
|
|
go startServer(addr)
|
|
client, _ := geerpc.Dial("tcp", <-addr)
|
|
defer func() { _ = client.Close() }()
|
|
|
|
time.Sleep(time.Second)
|
|
// send request & receive response
|
|
var wg sync.WaitGroup
|
|
for i := 0; i < 5; i++ {
|
|
wg.Add(1)
|
|
go func(i int) {
|
|
defer wg.Done()
|
|
args := &Args{Num1: i, Num2: i * i}
|
|
var reply int
|
|
if err := client.Call("Foo.Sum", args, &reply); err != nil {
|
|
log.Fatal("call Foo.Sum error:", err)
|
|
}
|
|
log.Printf("%d + %d = %d", args.Num1, args.Num2, reply)
|
|
}(i)
|
|
}
|
|
wg.Wait()
|
|
}
|