﻿
{"id":20553,"date":"2021-01-04T18:56:39","date_gmt":"2021-01-04T18:56:39","guid":{"rendered":"https:\/\/www.gencayyildiz.com\/blog\/?p=20553"},"modified":"2021-01-04T18:56:39","modified_gmt":"2021-01-04T18:56:39","slug":"grpc-client-streaming-yontemiyle-client-ve-server-iletisimi","status":"publish","type":"post","link":"https:\/\/www.gencayyildiz.com\/blog\/grpc-client-streaming-yontemiyle-client-ve-server-iletisimi\/","title":{"rendered":"gRPC &#8211; Client Streaming Y\u00f6ntemiyle Client ve Server \u0130leti\u015fimi"},"content":{"rendered":"<div id=\"fb-root\"><\/div>\n<p>Merhaba,<\/p>\n<p>Bu i\u00e7eri\u011fimizde, iki uygulama aras\u0131nda ileti\u015fimin gRPC \u00fczerinden Client Streaming y\u00f6ntemiyle nas\u0131l sa\u011fland\u0131\u011f\u0131n\u0131 pratikte inceliyor olaca\u011f\u0131z.<\/p>\n<p>\u0130lk olarak Client Streaming y\u00f6nteminin ne oldu\u011funu hat\u0131rlayarak ba\u015flayal\u0131m.<br \/>\n<div id=\"attachment_20392\" style=\"width: 392px\" class=\"wp-caption aligncenter\"><a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/12\/gRPC-Nedir-Ne-Amacla-ve-Nasil-Kullanilir-4.png\"><img loading=\"lazy\" decoding=\"async\" aria-describedby=\"caption-attachment-20392\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/12\/gRPC-Nedir-Ne-Amacla-ve-Nasil-Kullanilir-4.png\" alt=\"gRPC Nedir? Ne Ama\u00e7la ve Nas\u0131l Kullan\u0131l\u0131r?\" width=\"382\" height=\"185\" class=\"size-full wp-image-20392\" srcset=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/12\/gRPC-Nedir-Ne-Amacla-ve-Nasil-Kullanilir-4.png 382w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/12\/gRPC-Nedir-Ne-Amacla-ve-Nasil-Kullanilir-4-300x145.png 300w\" sizes=\"auto, (max-width: 382px) 100vw, 382px\" \/><\/a><p id=\"caption-attachment-20392\" class=\"wp-caption-text\">Client&#8217;\u0131n server\u2019a stream mesaj g\u00f6nderdi\u011fi ve server\u2019\u0131n tek bir response d\u00f6nd\u00fcr\u00fc\u011f\u00fc RPC t\u00fcr\u00fcd\u00fcr. Yani client birden \u00e7ok mesaj g\u00f6nderiyor, server buna kar\u015f\u0131l\u0131k tek bir cevap d\u00f6nd\u00fcr\u00fcyor. Anlayaca\u011f\u0131n\u0131z Server Streaming&#8217;in tam tersi bir ak\u0131\u015f s\u00f6z konusudur.<\/p><\/div><br \/>\nEvet, <a href=\"https:\/\/www.gencayyildiz.com\/blog\/grpc-server-streaming-yontemiyle-client-ve-server-iletisimi\/\" rel=\"noopener noreferrer\" target=\"_blank\">Server Streaming<\/a>&#8216;de inceledi\u011fimiz ak\u0131\u015f\u0131n tam tersi Client Streaming i\u00e7in ge\u00e7erlidir. \u015eimdi gelin, bu y\u00f6ntem ile bir client ve server \u00e7al\u0131\u015fmas\u0131 sergileyelim.<\/p>\n<h4 style=\"color:purple;\">Proto Dosyas\u0131<\/h4>\n<p>Client ve server olmak \u00fczere her iki uygulama aras\u0131ndaki kontrat\u0131 a\u015fa\u011f\u0131daki <em>message.proto<\/em> dosyas\u0131 \u00fczerinden sa\u011flayaca\u011f\u0131z.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\nsyntax = &quot;proto3&quot;;\r\noption csharp_namespace = &quot;gRPCExample&quot;;\r\npackage message;\r\n\r\nservice Message {\r\n  rpc GetMessage(stream MessageRequest) returns (MessageResponse);\r\n}\r\nmessage MessageRequest {\r\n  string message = 1;\r\n}\r\nmessage MessageResponse {\r\n  string message = 1;\r\n}\r\n<\/pre>\n<p>Yukar\u0131daki <em>message.proto<\/em> i\u00e7eri\u011fine g\u00f6z atarsan\u0131z e\u011fer i\u00e7erisinde &#8216;GetMessage&#8217; isimli fonksiyon bar\u0131nd\u0131ran &#8216;Message&#8217; isimli bir servis olu\u015fturulmaktad\u0131r. \u0130lgili fonksiyon yap\u0131lacak request neticesinde bir &#8216;MessageRequest&#8217; stream&#8217;i istemekte ve response olarak geriye &#8216;MessageResponse&#8217; nesnesi d\u00f6nd\u00fcrmektedir. Yani g\u00f6nderilen birden fazla &#8216;MessageRequest&#8217; nesnesine kar\u015f\u0131l\u0131k tek bir &#8216;MessageResponse&#8217; nesnesini cevap olarak g\u00f6ndermektedir.<\/p>\n<h4 style=\"color:purple;\">Server&#8217;da Message Service&#8217;i<\/h4>\n<p>Client&#8217;tan gelecek olan iste\u011fi server&#8217;da kar\u015f\u0131layacak olan &#8216;MessageService&#8217;i a\u015fa\u011f\u0131daki gibi tasarlayal\u0131m.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n    public class MessageService : MessageBase\r\n    {\r\n        public override async Task&lt;MessageResponse&gt; GetMessage(IAsyncStreamReader&lt;MessageRequest&gt; requestStream, ServerCallContext context)\r\n        {\r\n            await Task.Run(async () =&gt;\r\n            {\r\n                while (await requestStream.MoveNext())\r\n                {\r\n                    Console.WriteLine($&quot;Mesaj al\u0131nm\u0131\u015ft\u0131r.&quot;);\r\n                    Console.WriteLine(&quot;Gelen mesaj : &quot;);\r\n                    Console.WriteLine(requestStream.Current.Message);\r\n                }\r\n            });\r\n\r\n            return new MessageResponse { Message = &quot;\u0130stek al\u0131nd\u0131 ve i\u015flendi...&quot; };\r\n        }\r\n    }\r\n<\/pre>\n<p>Yukar\u0131daki servis detay\u0131n\u0131 incelerseniz e\u011fer kullan\u0131lan Client Streaming y\u00f6ntemine uygun olacak \u015fekilde stream olarak birden fazla de\u011fer \u015feklinde gelen request&#8217;e kar\u015f\u0131l\u0131k tek bir response d\u00f6n\u00fclmektedir.<\/p>\n<h4 style=\"color:purple;\">Client<\/h4>\n<p>\u0130stek g\u00f6nderecek client&#8217;\u0131n a\u015fa\u011f\u0131daki gibi geli\u015ftirilmesi yeterli olacakt\u0131r;<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n    class Program\r\n    {\r\n        static async Task Main(string&#x5B;] args)\r\n        {\r\n            var channel = GrpcChannel.ForAddress(&quot;https:\/\/localhost:5001&quot;);\r\n            var messageClient = new Message.MessageClient(channel);\r\n            Console.WriteLine(&quot;L\u00fctfen g\u00f6nderilecek mesaj\u0131 giriniz.&quot;);\r\n            var request = messageClient.GetMessage();\r\n\r\n            await Task.Run(async () =&gt;\r\n            {\r\n                int count = 0;\r\n                while (++count &lt;= 10)\r\n                {\r\n                    await request.RequestStream.WriteAsync(new MessageRequest { Message = $&quot;G\u00f6nderilen mesaj {count}&quot; });\r\n                    await Task.Delay(1000);\r\n                }\r\n            });\r\n\r\n            \/\/RequestStream ba\u015far\u0131yla sonland\u0131r\u0131l\u0131yor.\r\n            await request.RequestStream.CompleteAsync();\r\n\r\n            var response = await request;\r\n            Console.WriteLine($&quot;Gelen Cevap : {response.Message}&quot;);\r\n        }\r\n    }\r\n<\/pre>\n<p>Dikkat ederseniz client, kullan\u0131lan Client Streaming y\u00f6ntemine uygun olacak \u015fekilde stream data ile istekte bulunmakta, buna kar\u015f\u0131l\u0131k server&#8217;dan gelen &#8216;MessageResponse&#8217; t\u00fcr\u00fcnden sonucu elde ederek ekrana yazd\u0131rmaktad\u0131r.<\/p>\n<h4 style=\"color:purple;\">Test Edelim<\/h4>\n<p><a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2021\/01\/gRPC-Client-Streaming-Yontemiyle-Client-ve-Server-Iletisimi.gif\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2021\/01\/gRPC-Client-Streaming-Yontemiyle-Client-ve-Server-Iletisimi.gif\" alt=\"gRPC - Client Streaming Y\u00f6ntemiyle Client ve Server \u0130leti\u015fimi\" width=\"800\" height=\"875\" class=\"aligncenter size-full wp-image-20562\" \/><\/a><\/p>\n<p>G\u00f6r\u00fcld\u00fc\u011f\u00fc \u00fczere Client Streaming y\u00f6ntemiyle client ve server aras\u0131nda ba\u015far\u0131yla ileti\u015fim kurulabilmekte ve yap\u0131lan stream request&#8217;e kar\u015f\u0131l\u0131k tek bir response elde edilebilmektedir.<\/p>\n<p>\u0130lgilenenlerin faydalanmas\u0131 dile\u011fiyle\u2026<br \/>\nSonraki yaz\u0131lar\u0131mda g\u00f6r\u00fc\u015fmek \u00fczere\u2026<br \/>\n\u0130yi \u00e7al\u0131\u015fmalar dilerim\u2026<\/p>\n<p>Not : \u00d6rnek projeleri indirebilmek i\u00e7in a\u015fa\u011f\u0131daki adreslere t\u0131klay\u0131n\u0131z.<br \/>\n<a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2021\/01\/gRPCClientExample-3.zip\">gRPCClientExample<\/a><br \/>\n<a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2021\/01\/gRPCServerExample-2.zip\">gRPCServerExample<\/a><\/p>\n<!-- AddThis Advanced Settings generic via filter on the_content --><!-- AddThis Share Buttons generic via filter on the_content -->","protected":false},"excerpt":{"rendered":"<p>Merhaba, Bu i\u00e7eri\u011fimizde, iki uygulama aras\u0131nda ileti\u015fimin gRPC \u00fczerinden Client Streaming y\u00f6ntemiyle nas\u0131l sa\u011fland\u0131\u011f\u0131n\u0131 pratikte inceliyor olaca\u011f\u0131z. \u0130lk olarak Client Streaming y\u00f6nteminin ne oldu\u011funu hat\u0131rlayarak ba\u015flayal\u0131m. Evet, Server Streaming&#8216;de inceledi\u011fimiz ak\u0131\u015f\u0131n tam tersi Client&#46;&#46;&#46;<!-- AddThis Advanced Settings generic via filter on get_the_excerpt --><!-- AddThis Share Buttons generic via filter on get_the_excerpt --><\/p>\n","protected":false},"author":1,"featured_media":20392,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[4032],"tags":[4057,4065,4076,4077],"class_list":["post-20553","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-grpc","tag-client-streaming","tag-grpc","tag-grpc-client-streamingg","tag-rpc-client-streaming-iletisim"],"amp_enabled":true,"_links":{"self":[{"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts\/20553","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/comments?post=20553"}],"version-history":[{"count":10,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts\/20553\/revisions"}],"predecessor-version":[{"id":20566,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts\/20553\/revisions\/20566"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/media\/20392"}],"wp:attachment":[{"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/media?parent=20553"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/categories?post=20553"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/tags?post=20553"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}