JavaA2Z

KAB-studio > プログラミング > JavaA2Z > サーバーとは

サーバー

日本語 奉仕人
英語 server
ふりがな さーばー
フリガナ サーバー

解説

ネットワーク通信における「接続を待つ側」のこと。
クライアントサーバーシステムでは、サーバーがネットワーク接続を待ち続け、クライアントはサーバーへと接続し、その接続に対してサーバーが応える、という形式になる。
その「接続を待ち続け待機する側」が「サーバー」である。
たとえばHTTPであれば、Apache等のWebサーバーや、Tomcat等のWebサーバー機能を持つアプリケーションサーバーが該当する。
隠語として「」と呼ばれたりもする。
 
通常、サーバー側はクライアントからの接続を待ち続ける。
クライアントからの接続があるとストリームを開き、データを受け取り、データを返す。終了後は再び待機状態へと移る。
 
Javaではサーバーによる待機はソケットを用いるか、プロトコル別の専用クラスを使用する。
ソケットを用いる場合、ServerSocketクラスコンストラクタポート番号を指定し、accept()メソッドで待機を開始する。接続時に戻り値としてSocketクラスが返されるため、このSocketクラスでデータの入出力をう。
SocketクラスのgetInputStream()メソッドで入力用ストリームを、getOutputStream()メソッドで出力用ストリームを取得できる。クライアント側、サーバー側とも、このストリームを使用して入出力をう。
Socketクラス、ServerSocketクラスストリームは終了時にclose()メソッドを呼び終了処理をう必要がある。
 
また、「サーバー」という単語を使用した時、ソフトウェアではなくハードウェアを指す場合もある。
上記の説明による「ソフトウェアとしてのサーバー」が実されているマシンそのものをサーバーと呼ぶことも多い。

(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」表紙の説明をご覧ください。