具体的にはパラメータは引数として受け取らず、メソッドの返却値としてレスポンスではなくRPCのクライアントが返却されます。ようにレスポンスを抽出します。レスポンスは複数受け取ることになるためループの中で受け取ることになりますが、何らかの形で終了を検知しなければなりません。一致するかどうかで判定できるので検知したらループを抜けます。RPC複数(M)のリクエストに対して、1つのレスポンスを返します。gRPCまずはproto定義と自動生成ファイル。"goodmorningworld.proto",}今回作成するプログラムの概要は以下です。クライアントは標準入力から名前を受け取り、一つずつサーバに送信する空行が入力されるとクライアント側の入力は完了とするサーバはクライアントから受け取った名前を使い挨拶を組み立ててクライアントに返却する受け取った名前をデバッグ用に標準出力に表示するクライアントはサーバから受け取った挨拶を標準出力に表示する実用性はない。ようにリクエストを抽出するように実装します。ときにループを抜けるようにします。クライアント側RPCメソッドはRPCのクライアントが返却されます。ようにサーバからのレスポンスを抽出し、通信を終了します。RPC複数(N)のリクエストに対して、複数(M)のレスポンスを返すことで双方向の通信を実現します。gRPCまずはproto定義と自動生成ファイル。"chat.proto",}双方向ということですが、私の想像力が乏しいせいで例題がチャットくらいしか思い浮かばなかったのでかなり不完全ではありますがとりあえず作ってみました。今回作成するプログラムの概要は以下のようになっています。ともに保持するデバッグ用に標準出力にも表示するサーバはクライアントからメッセージを受信するたびに、クライアントごとに保持している最終受信時刻より後に受け取ったメッセージをすべてクライアントに送信するクライアントはサーバから受け取ったメッセージを標準出力に表示する続いてプログラム。これまでの中では一番複雑ですが、せいぜい60行くらいです。いう)を受け取るように実装します。ようにリクエストを抽出します。メソッドを使って複数返却できます。1個でもいいし、返却しなくても良いでしょう。クライアント側RPCメソッドはRPCのクライアントを返却します。「送信(入力)」と「受信」の両方を待ち受ける必要があるため、「送信(入力)」の方をゴルーチンでバックグラウンド実行させています。client1serverclient2はじめましてかれんですこんにちわ用高ですなんて呼んだらいいですか?こんにちわ用高ですかれんさん、いい名前ですね!なんて呼んだらいいですか?お気付きの通り、双方向通信ではあるもののリアルタイム通信ではないので使い勝手はお世辞にも良いとは言えません。クライアントに対してデータを送信する機能を提供していません。サーバはクライアントからRPC接続を受けるたびにゴルーチンを作り、該当するRPCメソッドはバックグラウンド実行されます。ここで作られたゴルーチンは接続してきたクライアントしか知らないので、現実装のRPCでは「受信(srv.Recv)」が唯一のメッセージ同期のトリガーとなってしまっているわけです。改良する(このセクションはgRPCとはそこまで関係ないので読み飛ばしてOKです)じゃあどうすればよいのか。一言でいうと「送信と受信のRPCを分ける」が答えです。今回は先ほどとは趣向を変えて、チャネルをメッセージキューのように使ってみようと思います。いうわけで「メッセージ送信RPC」「メッセージ受信RPC」「チャネル作成RPC」を用意します。"chat2.proto",}今回のプログラムの概要は以下のようになっています。クライアントに伝えます。セッションIDのようなものです(セキュリティは度外視)。クライアントはこのIDとメッセージを一緒にメッセージ送信RPCに送信し、受け取ったサーバはIDに紐付かない(つまり自分以外の)チャネルにメッセージを送信します。クライアントはこれに並行してメッセージ受信RPCにアクセスしておきます。サーバ側のメッセージ受信RPCはチャネルにメッセージが送られてきたタイミングでクライアントにレスポンスを返却するため、リアルタイムでメッセージが送受信されているように見えるというわけですね。このプログラムはリソース競合やメモリリークを考慮していないのでそのまま使うのはおすすめできません。dataメタデータは構造化されていない通信データです。メインではない何らかの付加情報をやり取りするときに使います。いってもあまり良い例が思い浮かびませんが、ログなどに記録されるタイムスタンプなどでしょうか。既存のにメタデータを使ったexampleがあったのでそれを使います。(対象ホストだけ変更)まずは定義から。この時点で変わったところはありません。"echo.proto",}以下、プログラムです。message)}サーバはコンテキスト経由でメタデータを受け取ります。ようにコンテキストからメタデータを取得します。