クライアントとサーバで異なるプログラミング言語で書かれていても、クライアントプログラムがサーバ上の機能を呼び出せるシステム
このシステムは、クライアントとサーバで異なるプログラミング言語で書かれていても、クライアントプログラムがサーバ上の機能を呼び出せるシステムです。
システムの実行には、ターミナルという黒い画面にコマンドを入力します。
このシステムでは、RPCの簡易的なシステムを体験することができます。
RPCとは、ネットワークを介して別々のコンピュータ上にあるプログラム間(異なるアドレス空間)で、同一コンピュータ内(ローカル)で機能の呼び出しを行っているかのように感じさせることができるプログラミング手法です。
RPCの実装には、下記のようなプログラミング言語を使用しています。
クライアント-サーバ | プログラミング言語 |
---|---|
クライアント | JavaScript(Node.js) |
サーバ | Python |
基本的な機能として、RPCのシステム/送受信されたデータの表示ができます。
説明で登場する用語について補足します。
用語の意味がわからない時は、下記表を確認してください。
用語 | 意味 |
---|---|
クライアント | サーバに接続し、データの取得や処理の依頼などを行うプログラムやコンピュータシステムのことです。 |
サーバ | ネットワークを介してクライアントの要求に応答し、データ、サービス、リソースを提供するシステムやソフトウェアのことです。 |
ターミナル | コンピュータに対してテキストベースのコマンド入力と出力を行うインターフェースのことです。 このインターフェースは、コマンドラインインターフェース(CLI)とも呼ばれます。 デモで表示されている黒い画面のことです。 |
コマンド | コンピュータに対して特定の操作を実行するよう指示するテキストベースの命令です。 コマンドを入力することで、コンピュータは、コマンドの意味を読み取りアクションをおこします。 |
RPC | ネットワークを介して別々のコンピュータ上にあるプログラム間(異なるアドレス空間)で、同一コンピュータ内(ローカル)で呼び出しを行っているかのように感じさせることができるプログラミング手法です。 |
このシステムを実行するには、下記ソフトウェアを事前にインストールしておく必要があります。
インストールされていない場合は、インストール/使用方法/使用例で記載されているコマンドが実行できませんので
必ずインストールしてから進めてください。
Gitがインストールされていない場合は、下記手順でインストールしてください。
-
ターミナルを起動する。
使用するOSによりターミナルの名称が異なりますので注意してください。
(例. Windows:コマンドプロンプト,mac:ターミナル) -
Gitがインストールされているか確認する。
git version 2.34.1
のように表示された場合は、Gitがインストールされています。
以降の手順はスキップしてください。
また、ターミナルは引き続き使用しますので開いたままにしてください!
git --version
- システムを更新する
sudo apt-get update
- Gitをインストールする
sudo apt install git
- Gitがインストールされたことを確認する。
git version 2.34.1
のように表示されていれば、Gitのインストールは完了です!
git --version
Pythonの公式サイトからあなたのPCのOSに合わせて、ダウンロードしてください。
ダウンロードしたファイルを使用してインストールできます。
Pythonがインストールされているかは、下記コマンドで確認することができます。
Python 3.10.12
のように表示されていれば、Pythonはインストールされています。
python3 --version
Node.jsは、JavaScript実行環境の1つです。
Node.jsのインストールについては、UbuntuへのNode.jsのインストールにわかりやすく解説してありましたので確認してください。
また、Node.jsについて詳しく知りたい場合は、Japan Node.js Associationを確認してください。
このシステムをあなたのPCで実行するために、クローンします。
クローンとは、このシステムの実行に必要なファイル(リポジトリのコンテンツ)をあなたのPCのローカル環境へコピーすることです。
下記手順でクローンしてください。
- リポジトリをクローンする
git clone https://github.com/Aki158/Remote-Procedure-Call.git
- クローンしたリポジトリへ移動する
cd Remote-Procedure-Call
- 1つ目のターミナル(サーバ用ターミナルとする)を起動する
- サーバ用ターミナルに下記コマンドを入力する
python3 server.py
- 2つ目のターミナル(クライアント用ターミナルとする)を起動する
- クライアント用ターミナルに下記コマンドを入力する
node client.py
- クライアント用ターミナルに0から6までの数字を入力し送信する
- クライアントが送信した数字をもとに、サーバ用ターミナルにデータが表示される
- サーバ用ターミナルが関数の実行結果を送信し、クライアント用ターミナルにメッセージが表示される。
一通りの手順のイメージはデモを参考にしてください。
- 1つ目のターミナル(サーバ用ターミナルとする)を起動する
- サーバ用ターミナルに下記コマンドを入力する
python3 server.py
- 2つ目のターミナル(クライアント用ターミナルとする)を起動する
- クライアント用ターミナルに下記コマンドを入力する
node client.py
- クライアント用ターミナルに0から6までの数字を入力し送信する。
0から6までの数字は、RPCの入出力表の入力部分に該当します。
今回は、0を入力しました。 - クライアントが送信した数字をもとに、サーバ用ターミナルにデータが表示される。
入力した0に紐づくデータが表示されました。 - サーバ用ターミナルが関数の実行結果を送信し、クライアント用ターミナルにメッセージが表示される。
クライアント用ターミナルに実行結果が表示されました。
カテゴリ | 技術スタック |
---|---|
開発言語 | JavaScript(Node.js) |
Python | |
インフラ | Ubuntu |
VirtualBox | |
その他 | Git |
Github |
機能 | 内容 |
---|---|
メッセージの表示 | 送受信されたメッセージを表示します。 |
クライアント | ユーザーから入力された数字を受け取り、その入力と紐づくデータへ変換します。 その後、サーバーに送信します。 また、サーバからのメッセージを受信します。 |
サーバ | クライアントからデータを受け取ります。 受け取ったデータをもとに、実行する関数を判断します。 関数の実行結果を応答としてクライアントに送り返します。 |
エラーハンドリング | サーバが、クライアントから不適切なデータを受け取った場合は、下記のように表示します。 ・サーバが期待している型とparam_typesが異なる場合: Invalid parameter ・methodの名前が見つからない場合: Function not found |
入力 | 入力に紐づくデータ | 出力 |
---|---|---|
0 | { "method":"floor", "params":5.345, "param_types":"double", "id":0 } |
{ "results": "5", "result_type": "int", "id": 0 } |
1 | { "method":"nroot", "params":[3,8], "param_types":"[int,int]", "id":1 } |
{ "results": "2.0", "result_type": "double", "id": 1 } |
2 | { "method":"reverse", "params":"hello", "param_types":"string", "id":2 } |
{ "results": "olleh", "result_type": "str", "id": 2 } |
3 | { "method":"validAnagram", "params":["anagram","ano grew"], "param_types":"[string,string]", "id":3 } |
{ "results": "False", "result_type": "bool", "id": 3 } |
4 | { "method":"sort", "params":["Nice","to","meet","you"], "param_types":"string[]", "id":4 } |
{ "results": "['Nice', 'meet', 'to', 'you']", "result_type": "list", "id": 4 } |
5 | { "method":"floor", "params":5.345, "param_types":"float", "id":5 } |
Invalid parameter |
6 | { "method":"subtract", "params":[42,23], "param_types":"[int,int]", "id":6 } |
Function not found |
- ユーザーが自由に入力できるようにする