8 "google.golang.org/grpc"
9 proto "chat" // 根据proto文件自动生成的代码
10)
11func main() {
12 // 创建连接
13 conn, err := grpc.Dial("localhost:3000", grpc.WithInsecure())
14 if err != nil {
15 log.Printf("连接失败: [%v] ", err)
16 return
17 }
18 defer conn.Close()
19 // 声明客户端
20 client := proto.NewChatClient(conn)
21 // 声明 context
22 ctx := context.Background()
23 // 创建双向数据流
24 stream, err := client.BidStream(ctx)
25 if err != nil {
26 log.Printf("创建数据流失败: [%v] ", err)
27 }
28 // 启动一个 goroutine 接收命令行输入的指令
29 go func() {
30 log.Println("请输入消息...")
31 输入 := bufio.NewReader(os.Stdin)
32 for {
33 // 获取 命令行输入的字符串, 以回车 作为结束标志
34 命令行输入的字符串, _ := 输入.ReadString(' ')
35 // 向服务端发送 指令
36 if err := stream.Send(&proto.Request{Input: 命令行输入的字符串}); err != nil {
37 return
38 }
39 }
40 }()
41 for {
42 // 接收从 服务端返回的数据流
43 响应, err := stream.Recv()
44 if err == io.EOF {
45 log.Println("⚠️ 收到服务端的结束信号")
46 break //如果收到结束信号,则退出“接收循环”,结束客户端程序
47 }
48 if err != nil {
49 // TODO: 处理接收错误
50 log.Println("接收数据出错:", err)
51 }
52 // 没有错误的情况下,打印来自服务端的消息
53 log.Printf("[客户端收到]: %s", 响应.Output)
54 }
55}
运行效果
先启动服务端程序 server.go
再启动客户端程序 client.go
输入消息,结果类似下图:
总结
gRPC是个很强大的RPC框架,而且支持多语言编程,上面的服务端、客户端程序我们完全可以用不同的语言实现,比如服务端用JAVA,客户端用Python...
gRPC的四种交互模式也给我们提供了很大的发挥空间,最近Nginx宣布支持gRPC,这可能也预示着某种趋势...
异步社区是一个有料、有货,又专业的IT专业图书社区,在这里可以读到最新、最热的IT类图书!
我想要社区的《Git高手之路》这本书,这本书是网络编程的经典图书,请大家帮我点赞!
本文摘自异步社区,作者:阿狸不歌 作品:《gRPC双向数据流的交互控制(go语言实现)》