Unixソケット-クライアントサーバーモデル
ほとんどのネットアプリケーションは、クライアントサーバーアーキテクチャを使用します。これは、相互に通信して情報を交換する2つのプロセスまたは2つのアプリケーションを指します。2つのプロセスの1つはクライアントプロセスとして機能し、もう1つのプロセスはサーバーとして機能します。
クライアントプロセス
これは、通常、情報を要求するプロセスです。応答を取得した後、このプロセスは終了するか、他の処理を実行する場合があります。
Example、インターネットブラウザはクライアントアプリケーションとして機能し、Webサーバーにリクエストを送信して1つのHTMLWebページを取得します。
サーバープロセス
これは、クライアントからの要求を受け取るプロセスです。クライアントからリクエストを受け取った後、このプロセスは必要な処理を実行し、リクエストされた情報を収集して、リクエスタークライアントに送信します。完了すると、別のクライアントにサービスを提供する準備が整います。サーバープロセスは常にアラートを受け取り、着信要求を処理する準備ができています。
Example − Webサーバーは、インターネットブラウザーからの要求を待機し続け、ブラウザーから要求を受け取るとすぐに、要求されたHTMLページを取得して、そのブラウザーに送り返します。
クライアントはサーバーのアドレスを知る必要がありますが、サーバーは接続が確立される前にアドレスやクライアントの存在さえ知る必要がないことに注意してください。接続が確立されると、双方が情報を送受信できます。
2層および3層アーキテクチャ
クライアント/サーバーアーキテクチャには2つのタイプがあります-
2-tier architecture−このアーキテクチャでは、クライアントはサーバーと直接対話します。このタイプのアーキテクチャには、いくつかのセキュリティホールとパフォーマンスの問題がある可能性があります。InternetExplorerとWebサーバーは2層アーキテクチャで動作します。ここで、セキュリティの問題はSecure Socket Layer(SSL)を使用して解決されます。
3-tier architectures−このアーキテクチャでは、もう1つのソフトウェアがクライアントとサーバーの間に配置されます。このミドルソフトウェアは「ミドルウェア」と呼ばれます。ミドルウェアは、高負荷の場合にすべてのセキュリティチェックと負荷分散を実行するために使用されます。ミドルウェアはクライアントからのすべての要求を受け取り、必要な認証を実行した後、その要求をサーバーに渡します。次に、サーバーは必要な処理を実行して応答をミドルウェアに送り返し、最後にミドルウェアはこの応答をクライアントに返します。3層アーキテクチャを実装する場合は、WebサーバーとWebブラウザの間にWebLogicやWebSphereソフトウェアなどのミドルウェアを配置できます。
サーバーの種類
あなたが持つことができるサーバーには2つのタイプがあります-
Iterative Server−これは、サーバープロセスが1つのクライアントにサービスを提供し、最初の要求を完了した後、別のクライアントからの要求を受け取る最も単純な形式のサーバーです。その間、別のクライアントが待ち続けます。
Concurrent Servers−このタイプのサーバーは、複数の同時プロセスを実行して、一度に多くの要求を処理します。これは、1つのプロセスに時間がかかり、別のクライアントがそれほど長く待つことができないためです。Unixで並行サーバーを作成する最も簡単な方法は、子プロセスをフォークして各クライアントを個別に処理することです。
クライアントを作る方法
接続を確立するためのシステムコールは、クライアントとサーバーで多少異なりますが、どちらもソケットの基本的な構成を含みます。どちらのプロセスも独自のソケットを確立します。
クライアント側でソケットを確立する手順は次のとおりです。
でソケットを作成します socket() システムコール。
を使用して、ソケットをサーバーのアドレスに接続します。 connect() システムコール。
データを送受信します。これを行うにはいくつかの方法がありますが、最も簡単な方法は、read() そして write() システムコール。
サーバーの作り方
サーバー側でソケットを確立する手順は次のとおりです。
でソケットを作成します socket() システムコール。
を使用してソケットをアドレスにバインドします bind()システムコール。インターネット上のサーバーソケットの場合、アドレスはホストマシンのポート番号で構成されます。
との接続を聞く listen() システムコール。
との接続を受け入れる accept()システムコール。この呼び出しは通常、クライアントがサーバーに接続するまで接続をブロックします。
を使用してデータを送受信します read() そして write() システムコール。
クライアントとサーバーの相互作用
以下は、完全なクライアントとサーバーの相互作用を示す図です-