成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

gRPC入門指南之 雙向流式RPC

網絡 通信技術
與服務端流式 RPC類似,都只支持單項連續發送數據,今天我們要來學習雙向流式 RPC 支持通信雙方同時多次發送或接收數據。

[[408239]]

本文轉載自微信公眾號「Golang來啦」,作者Seekload。轉載本文請聯系Golang來啦公眾號。

你好,我是 Seekload!

前言

前一篇文章我們學習了客戶端流式 RPC,客戶端多次向服務端發送數據,發送結束之后,由服務端返回一個響應。與服務端流式 RPC類似,都只支持單項連續發送數據,今天我們要來學習雙向流式 RPC 支持通信雙方同時多次發送或接收數據。如下如所示:

新建并編譯proto文件

新建 bidirectional_stream.proto 文件:

  1. syntax = "proto3"
  2.  
  3. package proto; 
  4.  
  5. // 定義流式請求信息 
  6. message StreamRequest{ 
  7.   // 參數類型 參數名稱 標識號 
  8.   string data = 1; 
  9.  
  10. // 定義流響應信息 
  11. message StreamResponse{ 
  12.   int32 code = 1; 
  13.   string value = 2; 
  14.  
  15. // 定義我們的服務(可以定義多個服務,每個服務可以定義多個接口) 
  16. service StreamService{ 
  17.   // 雙向流RPC,需要在請求、響應數據前加stream 
  18.   rpc Record(stream StreamRequest) returns (stream StreamResponse){}; 

雙向流式 RPC,定義方法時需要在請求值和返回值之前加上 stream。

進入 bidirectional_stream.proto 所在的目錄,使用如下命令編譯文件

  1. protoc --go_out=plugins=grpc:. bidirectional_stream.proto 

執行完成之后會生成 bidirectional_stream.pb.go 文件。

創建server端

  1. package main 
  2.  
  3. import ( 
  4.  pb "go-grpc-example/4-bidirectional_stream_rpc/proto" 
  5.  "google.golang.org/grpc" 
  6.  "io" 
  7.  "log" 
  8.  "net" 
  9.  "strconv" 
  10.  "time" 
  11.  
  12. const ( 
  13.  Address string = ":8000" 
  14.  Network string = "tcp" 
  15.  
  16. // 定義我們的服務 
  17. type StreamService struct{} 
  18.  
  19. // 實現 Record() 方法 
  20. func (s *StreamService) Record(srv pb.StreamService_RecordServer) error { 
  21.  n := 1 
  22.  for { 
  23.   // 接收數據 
  24.   req, err := srv.Recv() 
  25.   if err == io.EOF { 
  26.    return nil 
  27.   } 
  28.   if err != nil { 
  29.    log.Fatalf("stream get from client err: %v", err) 
  30.    return err 
  31.   } 
  32.   // 發送數據 
  33.   err = srv.Send(&pb.StreamResponse{ 
  34.    Code:  int32(n), 
  35.    Value: "This is the " + strconv.Itoa(n) + " message"
  36.   }) 
  37.   if err != nil { 
  38.    log.Fatalf("stream send to client err: %v", err) 
  39.    return err 
  40.   } 
  41.   n++ 
  42.   log.Println("stream get from client: ", req.Data) 
  43.   time.Sleep(1 * time.Second
  44.  } 
  45.  return nil 
  46.  
  47. func main() { 
  48.  // 1.監聽端口 
  49.  listener, err := net.Listen(Network, Address) 
  50.  if err != nil { 
  51.   log.Fatalf("listener err: %v", err) 
  52.  } 
  53.  log.Println(Address + " net.Listing..."
  54.  
  55.  // 2.實例化gRPC實例 
  56.  grpcServer := grpc.NewServer() 
  57.  
  58.  // 3.注冊我們的服務 
  59.  pb.RegisterStreamServiceServer(grpcServer, &StreamService{}) 
  60.  
  61.  // 4.啟動gRPC服務端 
  62.  err = grpcServer.Serve(listener) 
  63.  if err != nil { 
  64.   log.Fatalf("grpc server err: %v", err) 
  65.  } 

在實現的 Record() 方法中,for() 循環里面讀取客戶端發送的消息并返回一個響應數據。

運行服務端:

  1. go run server.go 
  2.  
  3. 輸出: 
  4. :8000  net listening... 

創建client端

  1. package main 
  2.  
  3. import ( 
  4.  "context" 
  5.  pb "go-grpc-example/4-bidirectional_stream_rpc/proto" 
  6.  "google.golang.org/grpc" 
  7.  "io" 
  8.  "log" 
  9.  "strconv" 
  10.  "time" 
  11.  
  12. const Address = ":8000" 
  13.  
  14. func main() { 
  15.  // 1.連接服務端 
  16.  conn, err := grpc.Dial(Address, grpc.WithInsecure()) 
  17.  if err != nil { 
  18.   log.Fatalf("grpc conn err: %v", err) 
  19.  } 
  20.  defer conn.Close() 
  21.  
  22.  // 2.創建gRPC客戶端 
  23.  grpcClient := pb.NewStreamServiceClient(conn) 
  24.  
  25.  // 3.調用 Record() 方法獲取流 
  26.  stream, err := grpcClient.Record(context.Background()) 
  27.  if err != nil { 
  28.   log.Fatalf("call record err: %v", err) 
  29.  } 
  30.  
  31.  for i := 0; i < 5; i++ { 
  32.   // 4.發送數據 
  33.   err := stream.Send(&pb.StreamRequest{ 
  34.    Data: strconv.Itoa(i), 
  35.   }) 
  36.   if err != nil { 
  37.    log.Fatalf("stream send to server err: %v", err) 
  38.   } 
  39.   // 5.接收服務端發送過來的數據 
  40.   resp, err := stream.Recv() 
  41.   if err == io.EOF { 
  42.    break 
  43.   } 
  44.   if err != nil { 
  45.    log.Fatalf("stream get from server err: %v", err) 
  46.   } 
  47.   log.Printf("stream get from server,code:%v,value:%v", resp.GetCode(), resp.Value) 
  48.   time.Sleep(1 * time.Second
  49.  } 
  50.  // 6.關閉流 
  51.  err = stream.CloseSend() 
  52.  if err != nil { 
  53.   log.Fatalf("close stream err:%v", err) 
  54.  } 

客戶端代碼,在 for() 循環里面向服務端發送了 5 次消息,并接收服務端返回的數據,5次數據交互之后調用 CloseSend() 關閉流。

運行客戶端:

  1. go run client.go 

客戶端輸出:

  1. stream get from server,code:1,value:This is the 1 message 
  2. stream get from server,code:2,value:This is the 2 message 
  3. stream get from server,code:3,value:This is the 3 message 
  4. stream get from server,code:4,value:This is the 4 message 
  5. stream get from server,code:5,value:This is the 5 message 

服務端輸出:

  1. stream get from client:  0 
  2. stream get from client:  1 
  3. stream get from client:  2 
  4. stream get from client:  3 
  5. stream get from client:  4 

觀察仔細的同學會注意到,客戶端和服務端是交替輸出的。

總結

 

這篇文章我們簡單介紹了 gRPC 的雙向流式 RPC,支持通信雙方同時多次發送或接收數據。

 

責任編輯:武曉燕 來源: Golang來啦
相關推薦

2021-06-10 07:49:26

RPCgRPC模式

2021-08-30 07:49:32

NacosSync雙向復制

2012-02-29 01:03:10

ubuntuLinux

2011-11-29 16:38:58

Knockout

2011-10-18 17:05:45

分布式流式數據庫

2011-03-08 09:22:37

2010-08-03 15:19:08

FlexBuilder

2011-05-18 15:15:44

MySQL

2021-03-26 10:31:19

人工智能AIOps

2024-01-02 12:17:44

Go傳統遠程

2011-08-03 10:01:20

IOS CoreData 雙向關系

2010-07-20 16:13:25

Perl線程

2010-12-31 13:30:12

2011-03-08 16:50:35

2022-05-08 16:42:27

Rust編程語言

2024-11-19 15:07:07

2019-07-18 07:52:01

路由策略IP路由

2011-01-10 13:21:45

linuxsamba

2015-09-24 09:54:32

物聯網

2013-01-08 13:33:07

Android開發Activity入門指南
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 国产高清视频在线播放 | 国产精品久久a | 国产成人免费视频 | 超碰成人在线观看 | 91精品国产高清一区二区三区 | 一区二区三区四区不卡 | 久久毛片 | 精品一区二区三区在线观看国产 | 成人九色 | 久久电影一区 | 欧美视频在线看 | 亚洲精品久久久久久久久久久 | 久久精品国产一区二区三区 | 久久久久亚洲精品 | 51ⅴ精品国产91久久久久久 | 国产亚洲精品久久情网 | 欧美日韩午夜精品 | 成人在线观看免费视频 | 国产精品久久久久久婷婷天堂 | 欧美一极视频 | 欧美极品在线观看 | 欧美一区二区三区免费在线观看 | 热re99久久精品国产99热 | 日韩图区| 成人综合久久 | 精品视频在线一区 | gav成人免费播放视频 | 亚洲精品欧美 | 国产一区二区三区视频 | 欧美午夜精品 | 国产精品揄拍一区二区久久国内亚洲精 | 日本黄色不卡视频 | 97精品超碰一区二区三区 | 欧美中文字幕一区二区 | 一区二区三区视频在线观看 | av在线播放网站 | 亚洲精品国产精品国自产在线 | 国产一区二区三区久久久久久久久 | 一区二区在线看 | 99pao成人国产永久免费视频 | 丁香婷婷久久久综合精品国产 |