1.proto
syntax = "proto3";//声明proto版本
option go_package = ".;proto";//声明包名
//声明grpc服务
service Greeter {
rpc ServerGet (streamRequest) returns (stream streamResponse);
}
//stream请求结构体
message streamRequest {
string data = 1;
}
//stream响应结构体
message streamResponse {
string data = 1 ;
}
2.Server
package main
import (
"fmt"
"grpctest2/stream_grpc/server_get_stream/proto"
"net"
"time"
"google.golang.org/grpc"
)
type Server struct{}
func (s *Server) ServerGet(request *proto.StreamRequest, res proto.Greeter_ServerGetServer) error {
i := 0
for {
i++
res.Send(&proto.StreamResponse{Data: fmt.Sprintf("client send:data:%s,time:%v", request.Data, time.Now().Unix())})
time.Sleep(time.Second)
if i == 10 {
break
}
}
return nil
}
func main() {
//创建一个grpc服务器
g := grpc.NewServer()
// 注册到事件中
proto.RegisterGreeterServer(g, &Server{})
//监听端口
conn, err := net.Listen("tcp", "127.0.0.1:8090")
if err != nil {
panic(err)
}
g.Serve(conn)
}
3.Client
package main
import (
"context"
"fmt"
"grpctest2/stream_grpc/server_get_stream/proto"
"log"
"google.golang.org/grpc"
)
func main() {
conn, err := grpc.Dial("127.0.0.1:8090", grpc.WithInsecure())
if err != nil {
panic(err)
}
defer conn.Close()
//通过连接生成一个Client对象
c := proto.NewGreeterClient(conn)
//调用服务给服务器发送data
requestData := &proto.StreamRequest{Data: "sss"}
res, _ := c.ServerGet(context.Background(), requestData)
for {
d, err := res.Recv()
if err != nil {
log.Panicln(err)
break
}
fmt.Println(d)
}
}