package main import ( "context" "fmt" "io" "log" "net" "time" "google.golang.org/grpc" ) type HelloServiceImpl struct{} func (p *HelloServiceImpl) Hello(ctx context.Context, args *String) (*String, error) { reply := &String{Value: "hello:" + args.GetValue()} return reply, nil } func (p *HelloServiceImpl) Channel(stream HelloService_ChannelServer) error { for { log.Println(111) args, err := stream.Recv() if err != nil { if err == io.EOF { return nil } return err } reply := &String{Value: "hello:" + args.GetValue()} err = stream.Send(reply) if err != nil { return err } } } func main() { go startGrpcServer() doClientWork() } func startGrpcServer() { grpcServer := grpc.NewServer() RegisterHelloServiceServer(grpcServer, &HelloServiceImpl{}) lis, err := net.Listen("tcp", ":1234") if err != nil { log.Fatal(err) } grpcServer.Serve(lis) } func doClientWork() { conn, err := grpc.Dial("localhost:1234", grpc.WithInsecure()) if err != nil { log.Fatal(err) } defer conn.Close() client := NewHelloServiceClient(conn) reply, err := client.Hello(context.Background(), &String{Value: "hello"}) if err != nil { log.Fatal(err) } fmt.Println(reply.GetValue()) stream, err := client.Channel(context.Background()) if err != nil { log.Fatal(err) } go func() { for { if err := stream.Send(&String{Value: "hi"}); err != nil { log.Fatal(err) } time.Sleep(time.Second) } }() for { log.Println(222) reply, err := stream.Recv() if err != nil { if err == io.EOF { break } log.Fatal(err) } fmt.Println(reply.GetValue()) } }