123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207 |
- /*
- *
- * Copyright 2018 gRPC authors.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- */
- // Binary server is an example server.
- package main
- import (
- "context"
- "flag"
- "fmt"
- "io"
- "log"
- "math/rand"
- "net"
- "time"
- "google.golang.org/grpc"
- "google.golang.org/grpc/codes"
- pb "google.golang.org/grpc/examples/features/proto/echo"
- "google.golang.org/grpc/metadata"
- "google.golang.org/grpc/status"
- )
- var port = flag.Int("port", 50051, "the port to serve on")
- const (
- timestampFormat = time.StampNano
- streamingCount = 10
- )
- type server struct{}
- func (s *server) UnaryEcho(ctx context.Context, in *pb.EchoRequest) (*pb.EchoResponse, error) {
- fmt.Printf("--- UnaryEcho ---\n")
- // Create trailer in defer to record function return time.
- defer func() {
- trailer := metadata.Pairs("timestamp", time.Now().Format(timestampFormat))
- grpc.SetTrailer(ctx, trailer)
- }()
- // Read metadata from client.
- md, ok := metadata.FromIncomingContext(ctx)
- if !ok {
- return nil, status.Errorf(codes.DataLoss, "UnaryEcho: failed to get metadata")
- }
- if t, ok := md["timestamp"]; ok {
- fmt.Printf("timestamp from metadata:\n")
- for i, e := range t {
- fmt.Printf(" %d. %s\n", i, e)
- }
- }
- // Create and send header.
- header := metadata.New(map[string]string{"location": "MTV", "timestamp": time.Now().Format(timestampFormat)})
- grpc.SendHeader(ctx, header)
- fmt.Printf("request received: %v, sending echo\n", in)
- return &pb.EchoResponse{Message: in.Message}, nil
- }
- func (s *server) ServerStreamingEcho(in *pb.EchoRequest, stream pb.Echo_ServerStreamingEchoServer) error {
- fmt.Printf("--- ServerStreamingEcho ---\n")
- // Create trailer in defer to record function return time.
- defer func() {
- trailer := metadata.Pairs("timestamp", time.Now().Format(timestampFormat))
- stream.SetTrailer(trailer)
- }()
- // Read metadata from client.
- md, ok := metadata.FromIncomingContext(stream.Context())
- if !ok {
- return status.Errorf(codes.DataLoss, "ServerStreamingEcho: failed to get metadata")
- }
- if t, ok := md["timestamp"]; ok {
- fmt.Printf("timestamp from metadata:\n")
- for i, e := range t {
- fmt.Printf(" %d. %s\n", i, e)
- }
- }
- // Create and send header.
- header := metadata.New(map[string]string{"location": "MTV", "timestamp": time.Now().Format(timestampFormat)})
- stream.SendHeader(header)
- fmt.Printf("request received: %v\n", in)
- // Read requests and send responses.
- for i := 0; i < streamingCount; i++ {
- fmt.Printf("echo message %v\n", in.Message)
- err := stream.Send(&pb.EchoResponse{Message: in.Message})
- if err != nil {
- return err
- }
- }
- return nil
- }
- func (s *server) ClientStreamingEcho(stream pb.Echo_ClientStreamingEchoServer) error {
- fmt.Printf("--- ClientStreamingEcho ---\n")
- // Create trailer in defer to record function return time.
- defer func() {
- trailer := metadata.Pairs("timestamp", time.Now().Format(timestampFormat))
- stream.SetTrailer(trailer)
- }()
- // Read metadata from client.
- md, ok := metadata.FromIncomingContext(stream.Context())
- if !ok {
- return status.Errorf(codes.DataLoss, "ClientStreamingEcho: failed to get metadata")
- }
- if t, ok := md["timestamp"]; ok {
- fmt.Printf("timestamp from metadata:\n")
- for i, e := range t {
- fmt.Printf(" %d. %s\n", i, e)
- }
- }
- // Create and send header.
- header := metadata.New(map[string]string{"location": "MTV", "timestamp": time.Now().Format(timestampFormat)})
- stream.SendHeader(header)
- // Read requests and send responses.
- var message string
- for {
- in, err := stream.Recv()
- if err == io.EOF {
- fmt.Printf("echo last received message\n")
- return stream.SendAndClose(&pb.EchoResponse{Message: message})
- }
- message = in.Message
- fmt.Printf("request received: %v, building echo\n", in)
- if err != nil {
- return err
- }
- }
- }
- func (s *server) BidirectionalStreamingEcho(stream pb.Echo_BidirectionalStreamingEchoServer) error {
- fmt.Printf("--- BidirectionalStreamingEcho ---\n")
- // Create trailer in defer to record function return time.
- defer func() {
- trailer := metadata.Pairs("timestamp", time.Now().Format(timestampFormat))
- stream.SetTrailer(trailer)
- }()
- // Read metadata from client.
- md, ok := metadata.FromIncomingContext(stream.Context())
- if !ok {
- return status.Errorf(codes.DataLoss, "BidirectionalStreamingEcho: failed to get metadata")
- }
- if t, ok := md["timestamp"]; ok {
- fmt.Printf("timestamp from metadata:\n")
- for i, e := range t {
- fmt.Printf(" %d. %s\n", i, e)
- }
- }
- // Create and send header.
- header := metadata.New(map[string]string{"location": "MTV", "timestamp": time.Now().Format(timestampFormat)})
- stream.SendHeader(header)
- // Read requests and send responses.
- for {
- in, err := stream.Recv()
- if err == io.EOF {
- return nil
- }
- if err != nil {
- return err
- }
- fmt.Printf("request received %v, sending echo\n", in)
- if err := stream.Send(&pb.EchoResponse{Message: in.Message}); err != nil {
- return err
- }
- }
- }
- func main() {
- flag.Parse()
- rand.Seed(time.Now().UnixNano())
- lis, err := net.Listen("tcp", fmt.Sprintf(":%d", *port))
- if err != nil {
- log.Fatalf("failed to listen: %v", err)
- }
- fmt.Printf("server listening at %v\n", lis.Addr())
- s := grpc.NewServer()
- pb.RegisterEchoServer(s, &server{})
- s.Serve(lis)
- }
|