1.proto
syntax = "proto3";
option go_package = ".;proto";
service Greenter {
rpc PGStream (stream allStreamRequest) returns (stream allStreamResponse);
}
message allStreamRequest {
string data = 1;
}
message allStreamResponse {
string data = 1;
}
2.server
package main
import (
"grpctest2/stream_grpc/all_stream/proto"
"log"
"net"
"sync"
"google.golang.org/grpc"
)
type Server struct{}
func (s *Server) PGStream(allStr proto.Greenter_PGStreamServer) error {
wg := sync.WaitGroup{}
wg.Add(2)
go func() {
for {
data, _ := allStr.Recv()
log.Println(data)
}
wg.Done()
}()
go func() {
for {
allStr.Send(&proto.AllStreamResponse{Data: "qweqwe"})
}
wg.Done()
}()
wg.Wait()
return nil
}
func main() {
g := grpc.NewServer()
proto.RegisterGreenterServer(g, &Server{})
conn, _ := net.Listen("tcp", "127.0.0.1:8090")
g.Serve(conn)
}
3.client
package main
import (
"context"
"grpctest2/stream_grpc/all_stream/proto"
"log"
"time"
"google.golang.org/grpc"
)
func main() {
conn, _ := grpc.Dial("127.0.0.1:8090", grpc.WithInsecure())
defer conn.Close()
c := proto.NewGreenterClient(conn)
requestData := &proto.AllStreamRequest{Data: "asd"}
allstr, _ := c.PGStream(context.Background())
go func() {
for {
allstr.Send(requestData)
time.Sleep(time.Second)
}
}()
go func() {
for {
data, _ := allstr.Recv()
log.Println(data)
}
}()
select{}
}