.netcore grpc客戶端流方法詳解

一、客戶端流式處理概述

  1. 客戶端流式處理方法在該方法沒有接收消息的情況下啟動。?requestStream?參數用于從客戶端讀取消息。 返回響應消息時,客戶端流式處理調用完成。
  2. 客戶端可以發送多個消息流到服務端,當所有客戶端消息流發送結束,調用請求流完結方法,則標記客戶端流消息推送結束,等待服務端執行完成。
  3. 等同于客戶端發送批量消息,服務端統一處理。

二、案例介紹

  1. 接下來 會提供三個案例,用于大家理解
  2. 第一個客戶端流的基礎用法
  3. 第二個客戶端流的優化版本
  4. 第三個客戶端的文件流式傳輸

三、服務端配置(注意:grpc相關配置參考我之前的文章

// 1.提供公共的實體proto文件
// 2.服務引用對應的proto文件
// 3.定義三個客戶流方法// 公共messages.proto文件
syntax = "proto3";option csharp_namespace = "GrpcProject";package grpc.serviceing;// 請求體
message ServerRequest{string name = 1;double height = 2;int32 age = 3;bool flag = 4;float x = 5;float y = 6;float z= 7;repeated string departments = 8;
}message ServerFileRequest{bytes fileBytes = 1;
}// 響應體
message ServerResponse{bool result = 1;
}// clientstream.proto 定義service方法
syntax = "proto3";import "google/protobuf/empty.proto";
import "Protos/messages.proto";option csharp_namespace = "GrpcProject";package grpc.serviceing;service ClientStreamRpc{// 基礎客戶端流處理rpc StreamingFromClient	(stream ServerRequest) returns (ServerResponse);// foreach 客戶端流式處理 前提使用C#8 或者更高版本rpc StreamingClientForeach(stream ServerRequest) returns (ServerResponse);// 文件流傳輸rpc FileStreamFromClient(stream ServerFileRequest) returns (ServerResponse);
}

服務接口實現:

   /// <summary>/// 客戶端流式處理/// </summary>public class ClientStreamService : ClientStreamRpc.ClientStreamRpcBase{/// <summary>/// 基礎訪問流模式/// </summary>/// <param name="requestStream"></param>/// <param name="context"></param>/// <returns></returns>public override async Task<ServerResponse> StreamingFromClient(IAsyncStreamReader<ServerRequest> requestStream, ServerCallContext context){while (await requestStream.MoveNext()){await Console.Out.WriteLineAsync("\r\n-------------------------激光射線------------------------------\r\n");ServerRequest request = requestStream.Current;await Handle(request);}return new ServerResponse();}/// <summary>/// foreach訪問流模式/// </summary>/// <param name="requestStream"></param>/// <param name="context"></param>/// <returns></returns>public override async Task<ServerResponse> StreamingClientForeach(IAsyncStreamReader<ServerRequest> requestStream, ServerCallContext context){await foreach (var request in requestStream.ReadAllAsync()){await Console.Out.WriteLineAsync("\r\n-------------------------激光射線------------------------------\r\n");await Handle(request);}return new ServerResponse();}/// <summary>/// 讀取文件流 組合成完整的文件。/// </summary>/// <param name="requestStream"></param>/// <param name="context"></param>/// <returns></returns>public override async Task<ServerResponse> FileStreamFromClient(IAsyncStreamReader<ServerFileRequest> requestStream, ServerCallContext context){ServerResponse serverResponse = new ServerResponse();serverResponse.Result = false;// 存儲流MemoryStream ms = new();await foreach (var request in requestStream.ReadAllAsync()){ms.Write(request.FileBytes.Span);await Console.Out.WriteLineAsync($"記錄字節大小:{ms.Length} bytes");}string filePath = Path.Combine(Directory.GetCurrentDirectory(), "log.txt");using FileStream fileStream = new FileStream(filePath, FileMode.OpenOrCreate, FileAccess.ReadWrite);fileStream.Position = 0;await fileStream.WriteAsync(ms.ToArray());fileStream.Flush();fileStream.Close();serverResponse.Result = true;return serverResponse;}private async Task Handle(ServerRequest request){if (request != null){foreach (var prop in request.GetType().GetProperties()){if (prop.CanRead && prop.GetValue(request) is not null){await Console.Out.WriteLineAsync($"property  name:{prop.Name};value:{prop.GetValue(request)}");}}}}}

?await foreach (var request in requestStream.ReadAllAsync()) 版本是C#8及以上版本才支持,這個需要注意!

四、客戶端配置

  1. 引用proto文件,配置為客戶端類型
  2. 根據編譯生成的函數進行傳參調用
    public partial class ClientStreamForm : Form{private readonly string _url;public ClientStreamForm(IConfiguration configuration){InitializeComponent();_url = configuration.GetConnectionString("ConnectionString");}private async void button1_Click(object sender, EventArgs e){var channel = GrpcChannel.ForAddress(_url);var client = new ClientStreamRpc.ClientStreamRpcClient(channel);var streamingFromClient = client.StreamingFromClient();for (int i = 0; i < 3; i++){ServerRequest request = new();request.Age = i;request.X = new Random(30).Next(50);request.Y = new Random(60).Next(50);request.Z = new Random(90).Next(50);request.Flag = i % 2 == 0 ? true : false;request.Height = 12;request.Departments.Add($"{i}");await streamingFromClient.RequestStream.WriteAsync(request);}await streamingFromClient.RequestStream.CompleteAsync();}private async void btnGrpcOptimize_Click(object sender, EventArgs e){var channel = GrpcChannel.ForAddress(_url);var client = new ClientStreamRpc.ClientStreamRpcClient(channel);var streamingFromClient = client.StreamingClientForeach();var departments = new List<string>(){"one","two","three","four","five","six"};ServerRequest request = new();foreach (var department in departments){request.Age = new Random(20).Next(100);request.X = new Random(30).Next(50);request.Y = new Random(60).Next(50);request.Z = new Random(90).Next(50);request.Flag = false;request.Height = 12;request.Departments.Add(department);await streamingFromClient.RequestStream.WriteAsync(request);}await streamingFromClient.RequestStream.CompleteAsync();}private async void btnFile_Click(object sender, EventArgs e){var channel = GrpcChannel.ForAddress(_url);var client = new ClientStreamRpc.ClientStreamRpcClient(channel);var streamingFromClient = client.FileStreamFromClient();var strMessage = "偉大抗日戰爭的一周年紀念,七月七日,快要到了。全民族的力量團結起來,堅持抗戰,堅持統一戰線,同敵人作英勇的戰爭,快一年了。這個戰爭,在東方歷史上是空前的,在世界歷史上也將是偉大的,全世界人民都關心這個戰爭。身受戰爭災難、為著自己民族的生存而奮斗的每一個中國人,無日不在渴望戰爭的勝利。然而戰爭的過程究竟會要怎么樣?能勝利還是不能勝利?能速勝還是不能速勝?很多人都說持久戰,但是為什么是持久戰?怎樣進行持久戰?很多人都說最后勝利,但是為什么會有最后勝利?怎樣爭取最后勝利?這些問題,不是每個人都解決了的,甚至是大多數人至今沒有解決的。于是失敗主義的亡國論者跑出來向人們說:中國會亡,最后勝利不是中國的。某些性急的朋友們也跑出來向人們說:中國很快就能戰勝,無需乎費大氣力。這些議論究竟對不對呢?我們一向都說:這些議論是不對的。可是我們說的,還沒有為大多數人所了解。一半因為我們的宣傳解釋工作還不夠,一半也因為客觀事變的發展還沒有完全暴露其固有的性質,還沒有將其面貌鮮明地擺在人們之前,使人們無從看出其整個的趨勢和前途,因而無從決定自己的整套的方針和做法。現在好了,抗戰十個月的經驗,盡夠擊破毫無根據的亡國論,也盡夠說服急性朋友們的速勝論了。在這種情形下,很多人要求做個總結性的解釋。尤其是對持久戰,有亡國論和速勝論的反對意見,也有空洞無物的了解。“盧溝橋事變以來,四萬萬人一齊努力,最后勝利是中國的。”這樣一種公式,在廣大的人們中流行著。這個公式是對的,但有加以充實的必要。抗日戰爭和統一戰線之所以能夠堅持,是由于許多的因素:全國黨派,從共產黨到國民黨;全國人民,從工人農民到資產階級;全國軍隊,從主力軍到游擊隊;國際方面,從社會主義國家到各國愛好正義的人民;敵國方面,從某些國內反戰的人民到前線反戰的兵士。總而言之,所有這些因素,在我們的抗戰中都盡了他們各種程度的努力。每一個有良心的人,都應向他們表示敬意。我們共產黨人,同其他抗戰黨派和全國人民一道,唯一的方向,是努力團結一切力量,戰勝萬惡的日寇。今年七月一日,是中國共產黨建立的十七周年紀念日。為了使每個共產黨員在抗日戰爭中能夠盡其更好和更大的努力,也有著重地研究持久戰的必要。因此,我的講演就來研究持久戰。和持久戰這個題目有關的問題,我都準備說到;但是不能一切都說到,因為一切的東西,不是在一個講演中完全說得了的。";var spanLength = strMessage.Length / 10;for (int i = 0; i < 10; i++){var startIndex = spanLength * i;string spanMessage;if (i == 9){spanMessage = strMessage.Substring(startIndex);}else{spanMessage = strMessage.Substring(startIndex, spanLength - 1);}var strBytes = Encoding.UTF8.GetBytes(spanMessage);var byteString = ByteString.CopyFrom(strBytes, 0, strBytes.Length);await streamingFromClient.RequestStream.WriteAsync(new ServerFileRequest() { FileBytes = byteString });Task.Delay(1000).Wait();}await streamingFromClient.RequestStream.CompleteAsync();}}
  1. IConfiguration 接口在program類中進行注入,讀取appsettings.json文件
  2. 調用接口查看執行結果
    1. 客戶端流基礎模式

    ? ? ?2.客戶端流foreach模式

    ? ? ? ?3.文件流處理模式

    ?

五、源碼地址

鏈接:https://pan.baidu.com/s/1PnLhysfGbVxC1ecpu7XReA?
提取碼:l6w0

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/35161.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/35161.shtml
英文地址,請注明出處:http://en.pswp.cn/news/35161.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

SpringBoot案例-部門管理-修改

目錄 前言 查看頁面原型&#xff0c;明確需求 頁面原型 需求 閱讀接口文件 思路分析 功能接口開發 控制層&#xff08;Controller類&#xff09; 業務層&#xff08;Service類&#xff09; 業務類 業務實現類 持久層&#xff08;Mapper類&#xff09; 接口測試 前…

Day 41

Day 41 343. 整數拆分 一個是j * dp[i - j]&#xff0c;相當于是拆分(i - j)&#xff0c;對這個拆分不理解的話&#xff0c;可以回想dp數組的定義。 dp[i] max({dp[i], (i - j) * j, dp[i - j] * j}); class Solution:def integerBreak(self, n: int) -> int:dp [0] *…

離線環境conda虛擬環境備份遷移--conda pack問題

1.第一步&#xff1a;創建虛擬環境 conda create -n pyenv --clone base 或者 conda create -n pyenv python3.8.5 --offline 命令執行結束&#xff0c;在路徑/xxxx/anaconda/envs 下看到pyenv 或者 conda info --envs 查看羅列虛擬環境 2.第二步&#xff1a;打包環境 conda …

ROS2 學習(一)介紹,環境搭建,以及個人安裝的一些建議

ROS2 學習 學習自b站課程&#xff1a;https://www.bilibili.com/video/BV16B4y1Q7jQ?p1 &#xff08;up主&#xff1a;古月居GYH&#xff09; ROS 介紹 Robot OS&#xff0c;為機器人開發提供了相對完善的 middleware&#xff0c;工具&#xff0c;軟件等。 ROS1 對嵌入式設…

計算機網絡(7) --- UDP協議和TCP協議

計算機網絡&#xff08;6&#xff09; --- https協議_哈里沃克的博客-CSDN博客https協議https://blog.csdn.net/m0_63488627/article/details/132112683?spm1001.2014.3001.5501 目錄 1.補充知識 1.PORT端口號 2.端口號范圍劃分 3.知名端口號 2.UDP協議 1.UDP報頭 2.U…

容器逃逸Docker cp(CVE-2019-14271)漏洞復現與分析

目錄 安裝 原理 EXP 參考 安裝 metarget安裝有點問題&#xff0c;所以我們直接指定安裝 可以用下面命令 查看包 apt-cache madison docker-ce 安裝 apt-get install -y docker-ce5:19.03.0~3-0~ubuntu-bionic 原理 EXP metarget/writeups_cnv/docker-cve-2019-14271 at …

Insert 1, Insert 2, Insert 3, ... 2023牛客暑期多校訓練營8 H

登錄—專業IT筆試面試備考平臺_牛客網 題目大意&#xff1a;給出一個長度為n的數組a&#xff0c;問有多少子串滿足其可以用多個排列穿插構成 1<n<1e6 思路&#xff1a;因為每個排列的起點都是1&#xff0c;所以我們大致的策略就是對于每一個1&#xff0c;記錄它往右最…

BGP小綜合

實驗題目如下&#xff1a; 實驗拓撲如下&#xff1a; 實驗要求如下&#xff1a; 【1】R2-7每臺路由器均存在一個環回接口用于建立鄰居&#xff0c;同時還存在一個環回來代表連接用戶的 接口;最終這些連接用戶的接口網絡需要可以和R1/8的環回通訊 【2】AS2網段地址1…

基于smardaten無代碼開發智能巡檢系統,讓無人機飛得更準

目錄 引言需求背景搭建思路開發過程&#xff08;1&#xff09;無人機設備數據接入&#xff08;2&#xff09;無人機巡檢任務管理&#xff08;3&#xff09;無人機三維防控監視&#xff08;4&#xff09;運防一體化大屏設計&#xff08;5&#xff09;異常告警管理&#xff08;6&…

面試總結-webpack/git

說說你對webpack的理解 webpack 是一個靜態模塊打包器&#xff0c;整個打包過程就像是一條生產線&#xff0c;把資源從入口放進去&#xff0c;經過一系列的加工&#xff08;loader&#xff09;&#xff0c;最終轉換成我們想要的結果&#xff0c;整個加工過程還會有監控&#x…

公共服務領域:西安新小區業主自立業主委員會年底分紅83萬以及103萬事件區塊鏈資金透明監管與投票解決方案的嘗試

公共服務領域:西安新小區業主自立業主委員會年底分紅83萬以及103萬事件區塊鏈資金透明監管與投票解決方案的嘗試 作者 重慶電子工程職業學院 | 向鍵雄 杜小敏 前言 本項目想法來源于,西安新小區業主開出物業自立業主委員會年底分紅83萬以及103萬事件,對于此類事件,我們刨…

微信小程序加載本地json和使用gulp壓縮js

加載本地json 創建json.js, data 里是json內容,exports 是數據出口 var data = [ {json1},{json2},{json3},{json10} ....] module.exports = {listData = data } 使用 這個require后面的參數是入口文件的文件路徑,但是注意必須是相對路徑,不能絕對路徑。 let json = re…

redis基礎(三十六)

安裝redis、配置redis 目錄 一、 概述 &#xff08;一&#xff09;NoSQL 1、類型 2、應用場景 &#xff08;二&#xff09;Redis 二、安裝 &#xff08;一&#xff09;編譯安裝 &#xff08;二&#xff09;RPM安裝 三、目錄結構 四、命令解析 五、redis登錄更改 1、…

2023國賽數學建模C題思路分析

文章目錄 0 賽題思路1 競賽信息2 競賽時間3 建模常見問題類型3.1 分類問題3.2 優化問題3.3 預測問題3.4 評價問題 4 建模資料 0 賽題思路 &#xff08;賽題出來以后第一時間在CSDN分享&#xff09; https://blog.csdn.net/dc_sinor?typeblog 1 競賽信息 全國大學生數學建模…

中睿天下入選河南省網信系統2023年度網絡安全技術支撐單位

近日&#xff0c;河南省委網信辦發布了“河南省網信系統2023年度網絡安全技術支撐單位名單”&#xff0c;中睿天下憑借出色的網絡安全技術能力和優勢成功入選。 本次遴選由河南省委網信辦會同國家計算機網絡與信息安全管理中心河南分中心&#xff08;以下簡稱安全中心河南分中心…

持續輸出:自媒體持續輸出文字內容、視音頻創作(視頻課程、書籍章節)

以下是自媒體持續輸出文字內容、視音頻創作的最佳方法&#xff1a; 靈感來源&#xff1a;尋找靈感來源是自媒體創作的重要一環。可以從日常生活、網絡熱點、行業動態等方面尋找創作靈感。 確定主題&#xff1a;在確定主題的時候&#xff0c;需要根據讀者和觀眾的需求&#xff…

Zebec Protocol 將進軍尼泊爾市場,通過 Zebec Card 推動地區金融平等

流支付正在成為一種全新的支付形態&#xff0c;Zebec Protocol 作為流支付的主要推崇者&#xff0c;正在積極的推動該支付方案向更廣泛的應用場景拓展。目前&#xff0c;Zebec Protocol 成功的將流支付應用在薪酬支付領域&#xff0c;并通過收購 WageLink 將其納入旗下&#xf…

Pytest測試框架3

目錄&#xff1a; pytest結合數據驅動-yamlpytest結合數據驅動-excelpytest結合數據驅動-csvpytest結合數據驅動-jsonpytest測試用例生命周期管理&#xff08;一&#xff09;pytest測試用例生命周期管理&#xff08;二&#xff09;pytest測試用例生命周期管理&#xff08;三&a…

CMake 配置 Vulkan 出現鏈接失敗,找不到 vkEnumerateInstanceExtensionProperties 符號的錯誤的解決方法

使用 CMake 配置 glfw, glm 的時候&#xff0c;總是提示鏈接失敗&#xff0c;找不到 vkEnumerateInstanceExtensionProperties 符號 cmake_minimum_required(VERSION 3.4...3.27)if(${CMAKE_VERSION} VERSION_LESS 3.27)cmake_policy(VERSION ${CMAKE_MAJOR_VERSION}.${CMAKE_…

UG NX二次開發(C#)-CAM-獲取刀具類型

文章目錄 1、前言2、UG NX中的刀具類型3、獲取刀具類型3.1 刀具類型幫助文檔1、前言 在UG NX的加工模塊,加工刀具是一個必要的因素,其包括了多種類型的類型,有銑刀、鉆刀、車刀、磨刀、成型刀等等,而且每種刀具所包含的信息也各不相同。想獲取刀具的信息,那就要知道刀具的…