成人免费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-01-10 13:21:45

linuxsamba

2011-03-08 16:50:35

2022-05-08 16:42:27

Rust編程語言

2024-11-19 15:07:07

2015-09-24 09:54:32

物聯網

2019-07-18 07:52:01

路由策略IP路由

2013-01-08 13:33:07

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

51CTO技術棧公眾號

主站蜘蛛池模板: 中文字幕一区在线观看视频 | 国产精品国产三级国产aⅴ入口 | 四虎在线播放 | 欧美日韩电影一区 | 亚洲毛片在线 | 激情网站 | 91av在线不卡 | 白浆在线 | 天堂综合网 | av成年人网站 | 日韩欧美精品在线 | 精品伊人久久 | 国产免费一区二区三区网站免费 | 91精品国产综合久久久亚洲 | 91精品久久久久久久久中文字幕 | 欧美一级视频免费看 | 天天射视频 | 亚洲欧美日本国产 | 久草在线 | 亚洲色欧美另类 | 国产精品久久久久久久白浊 | 欧美午夜一区 | 日韩喷潮 | 亚洲天堂精品一区 | 日韩成人免费视频 | 欧美xxxx日本| 欧美一区二区三区在线看 | www.操.com | 精品动漫一区 | 一区二区三区四区在线视频 | 国产一区久久 | 日韩精品视频网 | 亚洲综合二区 | 欧美不卡网站 | 99精品一区二区 | 久久久综合网 | 在线免费观看成人 | 91精品在线播放 | 一区2区 | 狠狠色综合久久丁香婷婷 | 欧美一区二区三区视频 |