クライアントとサーバ

ずいぶん偉そうな言い方だが、違う人達に3回ほど同じことを指摘したので4回目以降のためにまとめることにした。
 

俺にこのURLはられた人へ

よくあるミスだから、気にしないでおk。
たくさんの人が間違えることだからブログに書いたのです。
でも大事なことだからちゃんと覚えてね。
 
 

本文

ソフトウェア設計で気を付けないといけないことの一つ。
「クライアントはリクエストなしにサーバからパケットを受けることはできない」
 
これは大原則。気をつけることというか、「してはいけないこと」かな。
一応言葉の定義をしておくと

  • サーバ:常駐し、リクエストを受信して応答を返送するプロセス
  • クライアント:リクエストを送信し応答を受信するプロセス

 
NW的な言い回しに言い換えると、パケットをlistenするのがサーバ。
そのlistenしている相手にパケットを送るのがクライアント。
 
クライアントのプロセスは常駐しないし、ポートの監視も行っていないので、いつ来るかわからないパケットを待つことはできない。(リクエストを送ったときのみ、応答を受信するまでポートの監視を行う)
一方でサーバは常駐し随時ポートを監視しているので、突然リクエストが来ても応答を返送できる
 
言い換えると、リクエストなしにパケットを送りたいのなら、受信側にもサーバとなるプロセスが必要。
それ(受信側へのサーバプロセス配置)を意図していないなら、シーケンス図が間違っていることになる。
 

具体例 その1

Webアプリケーションのシーケンス図の一部。
つまりクライアント=Webブラウザ、サーバ=Webサーバ。
(リダイレクトやjavascriptによる自動更新で)ユーザの操作なしに画面遷移する場合です。
クライアントは操作せず、サーバ側から更新後の画面がでるので

 |クライアント|                    |サーバ|
   |               |
   |   自動更新された画面   |
   |<-----------------------------|
   |               |

と書きたくなるけれど、これは間違い。
Webブラウザは、サーバプロセスではないのでWebサーバから突然パケットを受けることはできない。
(必ず、対応するリクエストが存在する)
つまりは、裏側で(ユーザに見えないだけで)リクエストを送っているので

 |クライアント|                    |サーバ|
   |               |
   |   画面の自動更新要求   |
   |----------------------------->|
   |               |
   |   自動更新された画面   |
   |<- - - - - - - - - - - - - - -|
   |               |

と、するべき。

具体例 その2

おなじく、Webアプリケーションのシーケンス図の一部。
認証機能で、パスワードを要求する場合。
サーバ側からパスワード要求が行われるので

 |クライアント|                    |サーバ|
   |               |
   |   パスワード入力画面   |
   |<-----------------------------|
   |               |
   |     パスワード     |
   |- - - - - - - - - - - - - - ->|
   |               |
   |      認証結果     |
   |<- - - - - - - - - - - - - - -|
   |               |

と書きたくなるけれど、これは間違い。
この場合の間違いは2点

  • パスワード入力画面は、パスワード入力画面表示を要求されて初めて表示される
  • 認証結果をいきなりおくっているが、これに対応するリクエストがない

理由は具体例1と同じ。
クライアントには、要求に応答する機能はないので、入力画面にパスワードを返すことはできない。
また、呼び出しなしに応答があるのはシーケンス図としておかしい。
(関数呼び出ししていないのに返り値が帰ってくるようなもん。異次元w)
なので、

 |クライアント|                    |サーバ|
   |               |
   | パスワード入力画面表示要求 |
   |----------------------------->|
   |               |
   |   パスワード入力画面   |
   |<- - - - - - - - - - - - - - -|
   |               |
   |  パスワード(認証要求)  |
   |----------------------------->|
   |               |
   |     認証結果      |
   |<- - - - - - - - - - - - - - -|
   |               |

と、するべき。
 
偉い人から見たら、突込みどころ満載&何を今更 かもしれないけれど、現場でこの説明が必要だったのです。ご勘弁を。
 
(でも、有識者による変なところへの指摘は大歓迎です。 よろしくご鞭撻ください)