package main import ( "fmt" "io" "log" "net" "time" "golang.org/x/net/context" "google.golang.org/grpc" "google.golang.org/grpc/credentials" "google.golang.org/grpc/metadata" "myschools.me/wyh/grpcservice/pb" ) const ( port = "8081" ) func main() { listen, err := net.Listen("tcp", "0.0.0.0:"+port) if err != nil { log.Fatal("err: %s", err.Error()) } // 证书 creds, err := credentials.NewServerTLSFromFile("cert.pem", "key.pem") if err != nil { log.Fatal("err: %s", err.Error()) } // 传递进grpc options := []grpc.ServerOption{grpc.Creds(creds)} // grpc服务 server := grpc.NewServer(options...) //服务注册 pb.RegisterEmployeeServiceServer(server, new(employeeService)) log.Println("grpc server started..." + port) server.Serve(listen) } type employeeService struct{} func (msg *employeeService) GetByNo(ctx context.Context, req *pb.GetByNoRequset) (*pb.EmployeeResponse, error) { for _, e := range employees { if req.No == e.No { return &pb.EmployeeResponse{ Employee: &e, }, nil } } return &pb.EmployeeResponse{}, nil } func (msg *employeeService) GetAll(req *pb.GetAllRequest, steam pb.EmployeeService_GetAllServer) error { for _, e := range employees { steam.Send(&pb.EmployeeResponse{ Employee: &e, }) time.Sleep(2 * time.Second) } return nil } func (msg *employeeService) AddPhoto(stream pb.EmployeeService_AddPhotoServer) error { md, ok := metadata.FromIncomingContext(stream.Context()) if ok { fmt.Println("employee", md["no"][0]) } img := []byte{} for { data, err := stream.Recv() if err == io.EOF { fmt.Printf("file size:%d\n", len(img)) return stream.SendAndClose(&pb.AddPhotoResponse{IsOk: true}) } if err != nil { return err } fmt.Printf("file received: %d", len(data.Data)) img = append(img, data.Data...) } return nil } func (msg *employeeService) Save(context.Context, *pb.EmployeeRequest) (*pb.EmployeeResponse, error) { return nil, nil } func (msg *employeeService) SaveAll(stream pb.EmployeeService_SaveAllServer) error { for { emp, err := stream.Recv() if err == io.EOF { break } if err != nil { return err } employees = append(employees, *emp.Employee) stream.Send(&pb.EmployeeResponse{Employee: emp.Employee}) } for _, emp := range employees { fmt.Println(emp) } return nil }