docs/code-samples/serving/grpc-ping-go/client/client.go

99 lines
2.3 KiB
Go

//go:build grpcping
// +build grpcping
package main
import (
"crypto/tls"
"flag"
"fmt"
"io"
"log"
"time"
pb "github.com/knative/docs/code-samples/serving/grpc-ping-go/proto"
"golang.org/x/net/context"
"google.golang.org/grpc"
"google.golang.org/grpc/credentials"
)
var (
serverAddr = flag.String("server_addr", "127.0.0.1:8080", "The server address in the format of host:port")
serverHostOverride = flag.String("server_host_override", "", "")
insecure = flag.Bool("insecure", false, "Set to true to skip SSL validation")
skipVerify = flag.Bool("skip_verify", false, "Set to true to skip server hostname verification in SSL validation")
)
func main() {
flag.Parse()
var opts []grpc.DialOption
if *serverHostOverride != "" {
opts = append(opts, grpc.WithAuthority(*serverHostOverride))
}
if *insecure {
opts = append(opts, grpc.WithInsecure())
} else {
cred := credentials.NewTLS(&tls.Config{
InsecureSkipVerify: *skipVerify,
})
opts = append(opts, grpc.WithTransportCredentials(cred))
}
conn, err := grpc.Dial(*serverAddr, opts...)
if err != nil {
log.Fatalf("fail to dial: %v", err)
}
defer conn.Close()
client := pb.NewPingServiceClient(conn)
ping(client, "hello")
pingStream(client, "hello")
}
func ping(client pb.PingServiceClient, msg string) {
ctx, cancel := context.WithTimeout(context.Background(), 120*time.Second)
defer cancel()
rep, err := client.Ping(ctx, &pb.Request{Msg: msg})
if err != nil {
log.Fatalf("%v.Ping failed %v: ", client, err)
}
log.Printf("Ping got %v\n", rep.GetMsg())
}
func pingStream(client pb.PingServiceClient, msg string) {
ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
defer cancel()
stream, err := client.PingStream(ctx)
if err != nil {
log.Fatalf("%v.(_) = _, %v", client, err)
}
waitc := make(chan struct{})
go func() {
for {
in, err := stream.Recv()
if err == io.EOF {
// read done.
close(waitc)
return
}
if err != nil {
log.Fatalf("Failed to receive a response : %v", err)
}
log.Printf("Got %s", in.GetMsg())
}
}()
i := 0
for i < 20 {
if err := stream.Send(&pb.Request{Msg: fmt.Sprintf("%s-%d", msg, i)}); err != nil {
log.Fatalf("Failed to send a ping: %v", err)
}
i++
}
stream.CloseSend()
<-waitc
}