export GO111MODULE=on go get github.com/golang/protobuf/protoc-gen-go export PATH="$PATH:$(go env GOPATH)/bin" Go to src目录下 git clone -b v1.31.0 https://github.com/grpc/grpc-go mkdir grpc-go/examples/myproject/pb
创建proto文件:
syntax = "proto3";
package pb;
option go_package = ".;pb";
message HelloRequest {
string username = 1;
}
message HelloResponse {
string message = 1;
}
message AddRequest {
int64 first = 1;
int64 second = 2;
}
message AddResponse {
int64 result = 3;
}
message ClientStream {
bytes stream = 1;
}
message ServerStream {
bytes stream = 1;
}
service HelloService {
rpc SayHello(HelloRequest) returns (HelloResponse){}
rpc Chat(stream ClientStream) returns (stream ServerStream){}
rpc Add(AddRequest) returns (AddResponse){}
}
protoc --go_out=plugins=grpc:. hello.proto 生成 hello.pb.go文件
编写客户端和服务端程序
mkdir client
package main
import (
"context"
"fmt"
"io"
"time"
pb "google.golang.org/grpc/examples/myproject/pb"
"google.golang.org/grpc"
)
func main() {
conn, err := grpc.Dial("localhost:6001", grpc.WithInsecure())
if err != nil {
fmt.Println(err.Error())
return
}
defer conn.Close()
c := pb.NewHelloServiceClient(conn)
r, err := c.Add(context.Background(), &pb.AddRequest{First: 88, Second: 88})
if err != nil {
fmt.Println(err.Error())
return
}
fmt.Println(r.Result)
// chat
chatClilent, e := c.Chat(context.Background())
if e != nil {
fmt.Println(e.Error())
return
}
go func() {
for {
stream, e := chatClilent.Recv()
if e == io.EOF {
fmt.Println("EOF")
return
}
if e != nil {
fmt.Println("cuowu")
return
}
fmt.Println("receive from server:", stream.Stream)
}
}()
chatClilent.Send(&pb.ClientStream{
Stream: newBytes(10, 9, 8, 7),
})
select {
case <-time.After(20 * time.Second):
}
}
func newBytes(a ...byte) []byte {
return a
}
mkdir server
package main
import (
"context"
"fmt"
"io"
"net"
pb "google.golang.org/grpc/examples/myproject/pb"
"google.golang.org/grpc"
)
type HelloService struct {
}
func (hs HelloService) Add(ctx context.Context, in *pb.AddRequest) (*pb.AddResponse, error) {
return &pb.AddResponse{Result: in.First + in.Second}, nil
}
func (hs *HelloService) SayHello(ctx context.Context, req *pb.HelloRequest) (*pb.HelloResponse, error) {
return &pb.HelloResponse{Message: fmt.Sprintf("你好,%s", req.Username)}, nil
}
func (hs *HelloService) Chat(conn pb.HelloService_ChatServer) error {
for {
stream, err := conn.Recv()
if err == io.EOF {
fmt.Println("EOF")
return nil
}
if err != nil {
fmt.Println(err.Error())
return err
}
fmt.Println("receive from client:", stream.Stream)
conn.Send(&pb.ServerStream{
Stream: newBytes(1, 2, 3, 4, 5),
})
// 关闭连接
// return nil
}
return nil
}
func main() {
lis, err := net.Listen("tcp", ":6001")
if err != nil {
fmt.Println(err.Error())
return
}
s := grpc.NewServer()
pb.RegisterHelloServiceServer(s, &HelloService{})
s.Serve(lis)
}
func newBytes(a ...byte) []byte {
return a
}