JavaA2Z

KAB-studio > プログラミング > JavaA2Z > クライアントサーバーシステムとは

クライアントサーバーシステム

日本語 客奉仕人仕組
英語 client/server system
ふりがな くらいあんとさーばーしすてむ
フリガナ クライアントサーバーシステム

解説

「接続側」と「待機側」によって成り立つネットワークシステム。
「接続側」を「クライアント」と呼ぶ。
「待機側」を「サーバー」と呼ぶ。
 
クライアントサーバーシステムでは、まずサーバーが待機状態となり、ネットワーク接続を待ち続ける。
次に、クライアントサーバーへと接続する。
その接続に対してサーバーが応え、クライアントサーバーが接続し、データの入出力がえるようになる。
クライアントサーバーに対して「指示」を文字列の形で送信する。
サーバーは指示を受け取り、その文字列に応じたデータを返す。
それを交互にう。
クライアント側は、データを全て取得し終えた等、目的を達した時に接続を切断する。
サーバー側はクライアント側から接続が切断されたら、再び待機状態へと移る。
この一連の流れがクライアントサーバーシステムである。
 
例としては、HTTPであれば、クライアント側にInternet Explorer等のWebブラウザサーバー側にApache等のWebサーバー、もしくはTomcat等のWebサーバー機能を持つアプリケーションサーバーが該当する。
Internet ExplorerからURLを指定してリクエストを発することで、URLを元にサーバーが決定され、取得したいHTMLが渡される。Apacheサーバーはその指示を受けてHTMLファイルの内容をInternet Explorerへと返し、Internet ExplorerはHTMLのデータをキャッシュへと保存し、それを元にレンダリングし画面へと表示する。
これがHTTPによる一般的なクライアントサーバーのやりとりである。
 
ただし、「クライアントサーバーシステム」という呼称を使用した場合、上記のHTTPの例のような「グローバルなアクセス」を指さない事がほとんどである。
「クライアントサーバーシステム」の狭義においては、「閉じたネットワーク」において、クライアント及びサーバー共に専用のアプリケーションを用いて処理をう「閉じたシステム」を指す。
この場合、Javaプログラムされていることは希であり、またApache等のオープンソース系アプリケーションパッケージ製品が使われる事も少ない。
クライアント側はVisual BasicやVisual C++によって作製され、サーバー側はIISとASP等によって実装されている場合が多い。また、サーバーが運用されるハードウェアが汎用機の場合にはC言語等によってサーバー実装される場合もある。
これらは前時代的なシステムであり「クラサバ」と略して呼ばれる。
 
そして、Javaはこの前時代的なシステムのリプレースう場合に出番となる。
ハードウェアのサポートが切れる、といった場合に、旧来の「クライアントサーバーシステム」から、インターネットベースの「クライアント」と「サーバー」を用いた方法へと作り直すことになる。
ただし、この場合クライアント及びサーバーは前述したHTTPの例のアプリケーションを使用し、サーバー側の処理をサーブレット等によって実装することになる。
「旧システムの言語からJavaへの移植が困難である」「旧システムの言語とJava言語の両方を知る技術者の不足」「旧システムのドキュメント紛失及び開発者退社により情報が皆無」「構造がそのままのため設計フェーズが省略される」「クライアント及びサーバーに使用するアプリケーションの限界」「ついで、にさせられる機能増強」等、阿鼻叫喚の地獄絵図が待ち受けるため気を付けること。

(KAB-studioからのおしらせです)

サンプルプログラム(とか)サンプルを別ウィンドウで表示サンプルをクリップボードへコピー(WindowsでIEの場合のみ)

// Sample.java
import java.net.Socket;
import java.net.ServerSocket;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.IOException;

public class Sample
{
    public static void main( String[] args )
    {
        // ポート番号12345で通信します。
        // ……もし、ポート番号12345が空いてないとダメです。
        // その場合はこの数字を他のにしてください。
        int port = 12345;

        // サーバーは別スレッドで。
        // もちろん、普通は「別のプログラム」をサーバーにします。
        ServerThread thread = new ServerThread( port );
        thread.start();

        try
        {
            // このスレッドを3秒止めます。
            // サーバー側の準備ができるのを待つためです。
            Thread.sleep( 3 * 1000 );
        }
        catch( InterruptedException e )
        {
            // sleep()メソッドを呼んでいる間に割り込みが入ると
            // InterruptedException例外が投げられます。
            e.printStackTrace();
        }

        // 以下、クライアント側の処理。

        // finallyでclose()するためここで宣言します。
        OutputStreamWriter outputStreamWriter = null;
        Socket socket = null;
        try
        {
            // このマシンの、portのポート番号でアクセスします。
            socket = new Socket( "localhost", port );

            // サーバーに文字列を出力するためのストリームを取得します。
            outputStreamWriter = new OutputStreamWriter( socket.getOutputStream() );

            // 文字列をサーバー側に出力します。
            System.out.println( "[クライアント]「あいうえお」を出力します。" );
            outputStreamWriter.write( "あいうえお", 0, 5 );
            outputStreamWriter.flush();
            System.out.println( "[クライアント]「あいうえお」を出力しました。" );
            // [サーバー]待機開始!
            // [サーバー]待機終了。
            // [サーバー]出力開始。
            // [クライアント]「あいうえお」を出力します。
            // あ
            // い
            // う
            // え
            // お
            // [クライアント]「あいうえお」を出力しました。
            // [サーバー]出力完了。
        }
        catch( IOException e )
        {
            // 出力時に問題があったらIOException例外が投げられます。
            e.printStackTrace();
        }
        finally
        {
            try
            {
                outputStreamWriter.close();
            }
            catch( IOException e )
            {
                e.printStackTrace();
            }

            // ソケットを閉じます。
            try
            {
                socket.close();
            }
            catch( IOException e )
            {
                e.printStackTrace();
            }
        }
    }
}

/**
*   サーバー側。
*/
class ServerThread extends Thread
{
    /** ポート番号 */
    private int port;

    /**
    *   コンストラクタ。
    */
    public ServerThread( int port )
    {
        this.port = port;
    }
    
    /**
    *   サーバーを起動します。
    */
    public void run()
    {
        // finallyでclose()するためここで宣言します。
        Socket socket = null;
        ServerSocket serverSocket = null;
        InputStreamReader inputStreamReader = null;
        try
        {
            // サーバーを作ります。
            serverSocket = new ServerSocket( port );

            // クライアントからのアクセスを待機開始!
            System.out.println( "[サーバー]待機開始!" );
            socket = serverSocket.accept();
            System.out.println( "[サーバー]待機終了。" );

            // クライアントから送られてきた文字列を受け取る
            // ストリームを用意します。
            inputStreamReader = new InputStreamReader( socket.getInputStream() );

            // 文字を出力します。
            System.out.println( "[サーバー]出力開始。" );
            while( true )
            {
                // read()メソッドで1文字取得します。
                int i = inputStreamReader.read();
                if( i == -1 )
                {
                    // -1が来たら終了です。
                    break;
                }

                // 文字として出力します。
                System.out.println( (char)i );
            }
            System.out.println( "[サーバー]出力完了。" );
        }
        catch( IOException e )
        {
            // 出力時に問題があったらIOException例外が投げられます。
            e.printStackTrace();
        }
        finally
        {
            try
            {
                inputStreamReader.close();
            }
            catch( IOException e )
            {
                e.printStackTrace();
            }

            // ソケット2とも閉じます。
            try
            {
                serverSocket.close();
            }
            catch( IOException e )
            {
                e.printStackTrace();
            }

            try
            {
                socket.close();
            }
            catch( IOException e )
            {
                e.printStackTrace();
            }
        }
    }
}
// Sample.java
import java.net.Socket;
import java.net.ServerSocket;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.IOException;

public class Sample
{
    public static void main( String[] args )
    {
        // ポート番号12345で通信します。
        // ……もし、ポート番号12345が空いてないとダメです。
        // その場合はこの数字を他のにしてください。
        int port = 12345;

        // サーバーは別スレッドで。
        // もちろん、普通は「別のプログラム」をサーバーにします。
        ServerThread thread = new ServerThread( port );
        thread.start();

        try
        {
            // このスレッドを3秒止めます。
            // サーバー側の準備ができるのを待つためです。
            Thread.sleep( 3 * 1000 );
        }
        catch( InterruptedException e )
        {
            // sleep()メソッドを呼んでいる間に割り込みが入ると
            // InterruptedException例外が投げられます。
            e.printStackTrace();
        }

        // 以下、クライアント側の処理。

        // finallyでclose()するためここで宣言します。
        OutputStreamWriter outputStreamWriter = null;
        Socket socket = null;
        try
        {
            // このマシンの、portのポート番号でアクセスします。
            socket = new Socket( "localhost", port );

            // サーバーに文字列を出力するためのストリームを取得します。
            outputStreamWriter = new OutputStreamWriter( socket.getOutputStream() );

            // 文字列をサーバー側に出力します。
            System.out.println( "[クライアント]「あいうえお」を出力します。" );
            outputStreamWriter.write( "あいうえお", 0, 5 );
            outputStreamWriter.flush();
            System.out.println( "[クライアント]「あいうえお」を出力しました。" );
            // [サーバー]待機開始!
            // [サーバー]待機終了。
            // [サーバー]出力開始。
            // [クライアント]「あいうえお」を出力します。
            // あ
            // い
            // う
            // え
            // お
            // [クライアント]「あいうえお」を出力しました。
            // [サーバー]出力完了。
        }
        catch( IOException e )
        {
            // 出力時に問題があったらIOException例外が投げられます。
            e.printStackTrace();
        }
        finally
        {
            try
            {
                outputStreamWriter.close();
            }
            catch( IOException e )
            {
                e.printStackTrace();
            }

            // ソケットを閉じます。
            try
            {
                socket.close();
            }
            catch( IOException e )
            {
                e.printStackTrace();
            }
        }
    }
}

/**
*   サーバー側。
*/
class ServerThread extends Thread
{
    /** ポート番号 */
    private int port;

    /**
    *   コンストラクタ。
    */
    public ServerThread( int port )
    {
        this.port = port;
    }
    
    /**
    *   サーバーを起動します。
    */
    public void run()
    {
        // finallyでclose()するためここで宣言します。
        Socket socket = null;
        ServerSocket serverSocket = null;
        InputStreamReader inputStreamReader = null;
        try
        {
            // サーバーを作ります。
            serverSocket = new ServerSocket( port );

            // クライアントからのアクセスを待機開始!
            System.out.println( "[サーバー]待機開始!" );
            socket = serverSocket.accept();
            System.out.println( "[サーバー]待機終了。" );

            // クライアントから送られてきた文字列を受け取る
            // ストリームを用意します。
            inputStreamReader = new InputStreamReader( socket.getInputStream() );

            // 文字を出力します。
            System.out.println( "[サーバー]出力開始。" );
            while( true )
            {
                // read()メソッドで1文字取得します。
                int i = inputStreamReader.read();
                if( i == -1 )
                {
                    // -1が来たら終了です。
                    break;
                }

                // 文字として出力します。
                System.out.println( (char)i );
            }
            System.out.println( "[サーバー]出力完了。" );
        }
        catch( IOException e )
        {
            // 出力時に問題があったらIOException例外が投げられます。
            e.printStackTrace();
        }
        finally
        {
            try
            {
                inputStreamReader.close();
            }
            catch( IOException e )
            {
                e.printStackTrace();
            }

            // ソケット2とも閉じます。
            try
            {
                serverSocket.close();
            }
            catch( IOException e )
            {
                e.printStackTrace();
            }

            try
            {
                socket.close();
            }
            catch( IOException e )
            {
                e.printStackTrace();
            }
        }
    }
}

この単語を含むページ

「みだし」に含まれているページ

「サンプルプログラムとか」に含まれているページ

  • (参照している単語はありません)
はてなブックマーク 詳細を表示 はてなブックマーク ブックマーク数
livedoorクリップ 詳細を表示 livedoorクリップ ブックマーク数
Yahoo!ブックマーク 詳細を表示 users
del.icio.us 登録する RSSに登録
サンプルを別ウィンドウで表示
サンプルをクリップボードへコピー(WindowsでIEの場合のみ)
update:2005/07/18
このページは、Javaプログラミング言語についての用語を網羅した辞書「JavaA2Z」の一ページです。
詳しくは「JavaA2Z」表紙の説明をご覧ください。