﻿
{"id":20538,"date":"2021-01-04T00:30:52","date_gmt":"2021-01-04T00:30:52","guid":{"rendered":"https:\/\/www.gencayyildiz.com\/blog\/?p=20538"},"modified":"2021-01-04T00:30:52","modified_gmt":"2021-01-04T00:30:52","slug":"grpc-server-streaming-yontemiyle-client-ve-server-iletisimi","status":"publish","type":"post","link":"https:\/\/www.gencayyildiz.com\/blog\/grpc-server-streaming-yontemiyle-client-ve-server-iletisimi\/","title":{"rendered":"gRPC &#8211; Server 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 Server Streaming y\u00f6ntemiyle nas\u0131l sa\u011fland\u0131\u011f\u0131n\u0131 pratikte inceliyor olaca\u011f\u0131z.<\/p>\n<p>\u0130lk olarak Server Streaming y\u00f6nteminin ne oldu\u011funu hat\u0131rlayarak ba\u015flayal\u0131m.<br \/>\n<div id=\"attachment_20387\" 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-3.png\"><img loading=\"lazy\" decoding=\"async\" aria-describedby=\"caption-attachment-20387\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/12\/gRPC-Nedir-Ne-Amacla-ve-Nasil-Kullanilir-3.png\" alt=\"gRPC Nedir? Ne Ama\u00e7la ve Nas\u0131l Kullan\u0131l\u0131r?\" width=\"382\" height=\"193\" class=\"size-full wp-image-20387\" srcset=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/12\/gRPC-Nedir-Ne-Amacla-ve-Nasil-Kullanilir-3.png 382w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/12\/gRPC-Nedir-Ne-Amacla-ve-Nasil-Kullanilir-3-300x152.png 300w\" sizes=\"auto, (max-width: 382px) 100vw, 382px\" \/><\/a><p id=\"caption-attachment-20387\" class=\"wp-caption-text\">Client\u2019\u0131n servar\u2019a tek bir istek g\u00f6nderdi\u011fi ve server\u2019\u0131n stream d\u00f6nmeye ba\u015flad\u0131\u011f\u0131 RPC t\u00fcr\u00fcd\u00fcr.<\/p><\/div><br \/>\nBu y\u00f6ntemde server tek bir request&#8217;e kar\u015f\u0131l\u0131k birden fazla response d\u00f6nebilmektedir.<\/p>\n<p>\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(MessageRequest) returns (stream 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; nesnesi istemekte ve response olarak geriye &#8216;MessageResponse&#8217; stream&#8217;i d\u00f6nd\u00fcrmektedir. Yani bu birden fazla &#8216;MessageResponse&#8217; nesnesi d\u00f6nd\u00fcrebilir demektir. \u015eimdi gelin bu durumu inceleyelim.<\/p>\n<h4 style=\"color:purple;\">Server\u2019da Message Service\u2019i<\/h4>\n<p>Client\u2019tan 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 GetMessage(MessageRequest request, IServerStreamWriter&lt;MessageResponse&gt; responseStream, ServerCallContext context)\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(request.Message);\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 responseStream.WriteAsync(new MessageResponse { Message = $&quot;G\u00f6nderilen mesaj {count}&quot; });\r\n                    await Task.Delay(1000);\r\n                }\r\n            });\r\n        }\r\n    }\r\n<\/pre>\n<p>Dikkat ederseniz e\u011fer &#8216;MessageService&#8217; geriye bir stream d\u00f6nd\u00fcrece\u011finden dolay\u0131 override edilen &#8216;GetMessage&#8217; metodunun ikinci parametresi &#8216;IServerStreamWriter&#8217; olarak generate edilmi\u015ftir. Yani stream edilebilir bir t\u00fcrde ilgili response de\u011ferimiz gelmi\u015ftir. Haliyle bizde \u00f6rneklendirme ama\u00e7l\u0131, ilgili metot i\u00e7erisinde operasyonel olarak 1&#8217;er saniye arayla toplamda 10 adet mesaj stream eden sembolik bir operasyon ger\u00e7ekle\u015ftirmekteyiz.<\/p>\n<h4 style=\"color:purple;\">Client<\/h4>\n<p>\u0130stek g\u00f6nderecek client\u2019\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 messageResponse = messageClient.GetMessage(new MessageRequest { Message = Console.ReadLine() });\r\n\r\n            await Task.Run(async () =&gt;\r\n            {\r\n                while (await messageResponse.ResponseStream.MoveNext(new System.Threading.CancellationToken()))\r\n                    Console.WriteLine($&quot;Gelen mesaj : {messageResponse.ResponseStream.Current.Message}&quot;);\r\n            });\r\n        }\r\n    }\r\n<\/pre>\n<p>Dikkat ederseniz client kullan\u0131lan Server Streaming y\u00f6ntemine uygun olacak \u015fekilde tek bir istekte bulunmakta, lakin stream&#8217;den gelen bir\u00e7ok veriyi d\u00f6ng\u00fcyle elde etmektedir.<\/p>\n<h4 style=\"color:purple;\">Test Edelim<\/h4>\n<p><a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2021\/01\/gRPC-Server-Streaming-Yontemiyle-Client-ve-Server-Iletisimi.gif\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2021\/01\/gRPC-Server-Streaming-Yontemiyle-Client-ve-Server-Iletisimi.gif\" alt=\"gRPC - Server Streaming Y\u00f6ntemiyle Client ve Server \u0130leti\u015fimi\" width=\"800\" height=\"315\" class=\"aligncenter size-full wp-image-20549\" \/><\/a><br \/>\nG\u00f6r\u00fcld\u00fc\u011f\u00fc \u00fczere Server Streaming y\u00f6ntemiyle client ve server aras\u0131nda ba\u015far\u0131yla ileti\u015fim kurulabilmekte ve yap\u0131lan tek bir request&#8217;e kar\u015f\u0131l\u0131k birden fazla 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-2.zip\">gRPCClientExample<\/a><br \/>\n<a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2021\/01\/gRPCServerExample-1.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 Server Streaming y\u00f6ntemiyle nas\u0131l sa\u011fland\u0131\u011f\u0131n\u0131 pratikte inceliyor olaca\u011f\u0131z. \u0130lk olarak Server Streaming y\u00f6nteminin ne oldu\u011funu hat\u0131rlayarak ba\u015flayal\u0131m. Bu y\u00f6ntemde server tek bir request&#8217;e kar\u015f\u0131l\u0131k birden&#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":20387,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[4032],"tags":[4065,4060,4075,4058],"class_list":["post-20538","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-grpc","tag-grpc","tag-grpc-server-streaming","tag-grpc-server-streaming-iletisim","tag-server-streaming"],"amp_enabled":true,"_links":{"self":[{"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts\/20538","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=20538"}],"version-history":[{"count":6,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts\/20538\/revisions"}],"predecessor-version":[{"id":20552,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts\/20538\/revisions\/20552"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/media\/20387"}],"wp:attachment":[{"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/media?parent=20538"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/categories?post=20538"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/tags?post=20538"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}