package main
import (
"context"
"flag"
"fmt"
"log"
"net"
"os"
"time"
"google.golang.org/grpc"
"google.golang.org/grpc/credentials/insecure"
"google.golang.org/grpc/examples/helloworld/helloworld"
"google.golang.org/grpc/reflection"
)
const defaultAddress = "127.0.0.1:50051"
type greeterServer struct {
helloworld.UnimplementedGreeterServer
}
func (greeterServer) SayHello(_ context.Context, req *helloworld.HelloRequest) (*helloworld.HelloReply, error) {
name := req.GetName()
if name == "" {
name = "friend"
}
return &helloworld.HelloReply{
Message: fmt.Sprintf("Hello, %s!", name),
}, nil
}
func main() {
mode := flag.String("mode", "server", "server or client")
addr := flag.String("addr", defaultAddress, "address to listen on or connect to")
name := flag.String("name", "gRPC", "name to send in client mode")
flag.Parse()
logger := log.New(os.Stderr, "grpc-sample: ", log.LstdFlags)
switch *mode {
case "server":
if err := runServer(*addr, logger); err != nil {
logger.Fatal(err)
}
case "client":
if err := runClient(*addr, *name, logger); err != nil {
logger.Fatal(err)
}
default:
logger.Fatalf("unsupported mode %q, use server or client", *mode)
}
}
func runServer(addr string, logger *log.Logger) error {
lis, err := net.Listen("tcp", addr)
if err != nil {
return fmt.Errorf("listen on %s: %w", addr, err)
}
server := grpc.NewServer()
helloworld.RegisterGreeterServer(server, greeterServer{})
reflection.Register(server)
logger.Printf("server listening on %s with reflection enabled", addr)
return server.Serve(lis)
}
func runClient(addr, name string, logger *log.Logger) error {
ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
defer cancel()
conn, err := grpc.DialContext(
ctx,
addr,
grpc.WithTransportCredentials(insecure.NewCredentials()),
grpc.WithBlock(),
)
if err != nil {
return fmt.Errorf("connect to %s: %w", addr, err)
}
defer conn.Close()
client := helloworld.NewGreeterClient(conn)
resp, err := client.SayHello(ctx, &helloworld.HelloRequest{Name: name})
if err != nil {
return fmt.Errorf("invoke SayHello: %w", err)
}
logger.Printf("response: %s", resp.GetMessage())
return nil
}
|