package main import( "context" "fmt" log "github.com/sirupsen/logrus" "google.golang.org/grpc" "io" "net" "strconv" "sync" pb "test/grpctest/proto" "time" ) type Server struct { } //一元 func (s *Server) GetData (context context.Context, reqData *pb.ReqData) (*pb.RepData, error){ fmt.Println("request:",reqData.Data) rep := &pb.RepData{ Data: "hello,"+reqData.Data, } return rep,nil } //服务端发送流调用 func (s *Server) GetStream (req *pb.ReqData, rep pb.ObjectStorageService_GetStreamServer ) error{ fmt.Println("request",req.Data) if req.Data == "shuai" { cnt := 0 resp := &pb.RepData{ Data: "hello,"+req.Data, } for{ err := rep.Send(resp) if err != nil{ fmt.Println("send to client failed:",err.Error()) break } time.Sleep(time.Second) if cnt > 10 { break } cnt++ } }else{ fmt.Println("error request") } return nil } // func (s *Server) SetStream(req pb.ObjectStorageService_SetStreamServer) error { var err error for { req,err := req.Recv() if err != nil{ if err == io.EOF { fmt.Println("server received over") break }else{ fmt.Println("error:",err.Error()) break } } fmt.Println("server received:",req.Data) } rep := &pb.ReqData{ Data: "over", } req.SendMsg(rep) return err } //双向流式调用 func (s *Server) AllStream (req pb.ObjectStorageService_AllStreamServer) error { wg := sync.WaitGroup{} wg.Add(2) go func() { defer wg.Done() for { recvMsg,err := req.Recv() if err != nil{ if err == io.EOF { fmt.Println("server received over") break }else{ fmt.Println("error:",err.Error()) break } } fmt.Println("server received",recvMsg.Data) } }() go func() { defer wg.Done() cnt := 0 for { err := req.Send(&pb.RepData{ Data: "over" + strconv.Itoa(cnt), }) if err != nil{ fmt.Println("error:",err.Error()) } if cnt > 3 { break } cnt++ time.Sleep(time.Second) } }() wg.Wait() return nil } func main(){ listen,err := net.Listen("tcp","127.0.0.1:10000") if err != nil { log.Fatal("server build error:",err.Error()) } g := grpc.NewServer() pb.RegisterObjectStorageServiceServer(g,&Server{}) err = g.Serve(listen) if err != nil { log.Fatal("failed to server:",err.Error()) } }