Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

...

Code Block
grpcui -plaintext 127.0.0.1:50051 



Sample Code

Code Block
languagebash
titleSampleServerClient
collapsetrue
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
}

...