クライアントとサーバ
ずいぶん偉そうな言い方だが、違う人達に3回ほど同じことを指摘したので4回目以降のためにまとめることにした。
俺にこのURLはられた人へ
よくあるミスだから、気にしないでおk。
たくさんの人が間違えることだからブログに書いたのです。
でも大事なことだからちゃんと覚えてね。
本文
ソフトウェア設計で気を付けないといけないことの一つ。
「クライアントはリクエストなしにサーバからパケットを受けることはできない」
これは大原則。気をつけることというか、「してはいけないこと」かな。
一応言葉の定義をしておくと
- サーバ:常駐し、リクエストを受信して応答を返送するプロセス
- クライアント:リクエストを送信し応答を受信するプロセス
NW的な言い回しに言い換えると、パケットをlistenするのがサーバ。
そのlistenしている相手にパケットを送るのがクライアント。
クライアントのプロセスは常駐しないし、ポートの監視も行っていないので、いつ来るかわからないパケットを待つことはできない。(リクエストを送ったときのみ、応答を受信するまでポートの監視を行う)
一方でサーバは常駐し随時ポートを監視しているので、突然リクエストが来ても応答を返送できる
言い換えると、リクエストなしにパケットを送りたいのなら、受信側にもサーバとなるプロセスが必要。
それ(受信側へのサーバプロセス配置)を意図していないなら、シーケンス図が間違っていることになる。
具体例 その1
Webアプリケーションのシーケンス図の一部。
つまりクライアント=Webブラウザ、サーバ=Webサーバ。
(リダイレクトやjavascriptによる自動更新で)ユーザの操作なしに画面遷移する場合です。
クライアントは操作せず、サーバ側から更新後の画面がでるので
|クライアント| |サーバ| | | | 自動更新された画面 | |<-----------------------------| | |
と書きたくなるけれど、これは間違い。
Webブラウザは、サーバプロセスではないのでWebサーバから突然パケットを受けることはできない。
(必ず、対応するリクエストが存在する)
つまりは、裏側で(ユーザに見えないだけで)リクエストを送っているので
|クライアント| |サーバ| | | | 画面の自動更新要求 | |----------------------------->| | | | 自動更新された画面 | |<- - - - - - - - - - - - - - -| | |
と、するべき。
具体例 その2
おなじく、Webアプリケーションのシーケンス図の一部。
認証機能で、パスワードを要求する場合。
サーバ側からパスワード要求が行われるので
|クライアント| |サーバ| | | | パスワード入力画面 | |<-----------------------------| | | | パスワード | |- - - - - - - - - - - - - - ->| | | | 認証結果 | |<- - - - - - - - - - - - - - -| | |
と書きたくなるけれど、これは間違い。
この場合の間違いは2点
- パスワード入力画面は、パスワード入力画面表示を要求されて初めて表示される
- 認証結果をいきなりおくっているが、これに対応するリクエストがない
理由は具体例1と同じ。
クライアントには、要求に応答する機能はないので、入力画面にパスワードを返すことはできない。
また、呼び出しなしに応答があるのはシーケンス図としておかしい。
(関数呼び出ししていないのに返り値が帰ってくるようなもん。異次元w)
なので、
|クライアント| |サーバ| | | | パスワード入力画面表示要求 | |----------------------------->| | | | パスワード入力画面 | |<- - - - - - - - - - - - - - -| | | | パスワード(認証要求) | |----------------------------->| | | | 認証結果 | |<- - - - - - - - - - - - - - -| | |
と、するべき。
偉い人から見たら、突込みどころ満載&何を今更 かもしれないけれど、現場でこの説明が必要だったのです。ご勘弁を。
(でも、有識者による変なところへの指摘は大歓迎です。 よろしくご鞭撻ください)