| // +build ignore,OMIT |
| |
| // The client command issues RPCs to a Google server and prints the |
| // results. |
| // |
| // In "search" mode, client calls Search on the server and prints the |
| // results. |
| // |
| // In "watch" mode, client starts a Watch on the server and prints the |
| // result stream. |
| package main |
| |
| import ( |
| "flag" |
| "fmt" |
| "io" |
| "log" |
| "time" |
| |
| "golang.org/x/net/context" |
| pb "golang.org/x/talks/content/2015/gotham-grpc/search" |
| "google.golang.org/grpc" |
| ) |
| |
| var ( |
| server = flag.String("server", "localhost:36060", "server address") |
| mode = flag.String("mode", "search", `one of "search" or "watch"`) |
| query = flag.String("query", "test", "query string") |
| ) |
| |
| func main() { |
| flag.Parse() |
| |
| // Connect to the server. |
| conn, err := grpc.Dial(*server, grpc.WithInsecure()) // HL |
| if err != nil { |
| log.Fatalf("fail to dial: %v", err) |
| } |
| defer conn.Close() |
| client := pb.NewGoogleClient(conn) // HL |
| |
| // Run the RPC. |
| switch *mode { |
| case "search": |
| search(client, *query) // HL |
| case "watch": |
| watch(client, *query) |
| default: |
| log.Fatalf("unknown mode: %q", *mode) |
| } |
| } |
| |
| // search issues a search for query and prints the result. |
| func search(client pb.GoogleClient, query string) { |
| ctx, cancel := context.WithTimeout(context.Background(), 80*time.Millisecond) // HL |
| defer cancel() |
| req := &pb.Request{Query: query} // HL |
| res, err := client.Search(ctx, req) // HL |
| if err != nil { |
| log.Fatal(err) |
| } |
| fmt.Println(res) // HL |
| } |
| |
| // watch runs a Watch RPC and prints the result stream. |
| func watch(client pb.GoogleClient, query string) { |
| ctx, cancel := context.WithCancel(context.Background()) |
| defer cancel() |
| req := &pb.Request{Query: query} // HL |
| stream, err := client.Watch(ctx, req) // HL |
| if err != nil { |
| log.Fatal(err) |
| } |
| for { |
| res, err := stream.Recv() // HL |
| if err == io.EOF { // HL |
| fmt.Println("and now your watch is ended") |
| return |
| } |
| if err != nil { |
| log.Fatal(err) |
| } |
| fmt.Println(res) // HL |
| } |
| } |