たるこすの日記

たるこすの日記

リアルからバーチャルへ、バーチャルからリアルへ

gRPC の C# サンプルを動かしてみる

gRPC は Google によって開発された RPC(Remote Procedure Call) フレームワークです。

まずは、公式のサンプルプロジェクトを動かすところから試してみました。

動作環境

C# のサンプルプロジェクト

公式ドキュメントはこちらです。

grpc.io

まず、GitHub の gRPC リポジトリをクローンします。

$ git clone -b v1.19.0 https://github.com/grpc/grpc

クローンした grpc フォルダの中にある examples\csharp\Helloworld\Greeter.slnVisual Studio で開きます。
Greeter, GreeterClient, GreeterServer という3つのプロジェクトが含まれていました。

動かしてみる

GreeterClient と GreeterServer をそれぞれ実行します。
ただし、自分の環境ではそれぞれのプロジェクトにある Program.cs で指定されているポート番号を変更する必要がありました。

詳しいことは良くわからないのですが、デフォルトで指定されている 50051 ポートは Windows では何かの用途で確保されていて使えないようです。
参考: https://support.microsoft.com/en-us/help/4093046/ports-blocked-after-you-install-monthly-rollup-package-kb4074588

今回はポート番号を10051に変更して動作させました。

GreeterServer

GreeterClient

コードの抜粋

以下はサンプルコードから抜粋したコードです。

サーバ側のコード

クライアント側のコード

クライアント側では Name に "you" を代入した HelloRequest メッセージを作成し、SayHello メソッドを呼んでいます。
サーバ側では、Message に "Hello " + request.Name (ここでは "Hello you")を代入した HelloReply メッセージを返します。

クライアント側で HelloReply の Message を表示すると、"Hello you" が表示されます。

.proto ファイル

.proto ファイルは Protocol Buffers(プロトコルバッファ)のメッセージ構造を記述するものです。
gRPC は Protocl Buffers を使っていて、.proto ファイルでRPCのメソッドやメッセージ型を定義します。

サンプルプログラムでは、以下のような定義になっています。

記法を知らなくても、なんとなく以下のような定義が読み取れます。

  • Greeter という サービスは、HelloRequest を引数にとり、HelloReply を返す SayHello というメソッドを持っている
  • HelloRequest というメッセージ型には、string 型の name というフィールドがある
  • HelloReply というメッセージ型には、string 型の message というフィールドがある

この proto ファイルによる定義から、各言語(今回はC#)用のスクリプトが自動生成されます。

おわりに

今回は gRPC の C# サンプルプログラムを動かしてみました。
次回は、空の UWP プロジェクトから gRPC クライアントを作成し、このサンプルプログラムと通信できるようにしようと思います。