クライアントサーバーシステム
日本語 | 客奉仕人仕組 |
英語 | 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言語の両方を知る技術者の不足」「旧システムのドキュメント紛失及び開発者退社により情報が皆無」「構造がそのままのため設計フェーズが省略される」「クライアント及びサーバーに使用するアプリケーションの限界」「ついで、にさせられる機能増強」等、阿鼻叫喚の地獄絵図が待ち受けるため気を付けること。
「接続側」を「クライアント」と呼ぶ。
「待機側」を「サーバー」と呼ぶ。
クライアントサーバーシステムでは、まずサーバーが待機状態となり、ネットワーク接続を待ち続ける。
次に、クライアントはサーバーへと接続する。
その接続に対してサーバーが応え、クライアントとサーバーが接続し、データの入出力が行えるようになる。
クライアントはサーバーに対して「指示」を文字列の形で送信する。
サーバーは指示を受け取り、その文字列に応じたデータを返す。
それを交互に行う。
クライアント側は、データを全て取得し終えた等、目的を達した時に接続を切断する。
サーバー側はクライアント側から接続が切断されたら、再び待機状態へと移る。
この一連の流れがクライアントサーバーシステムである。
例としては、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言語の両方を知る技術者の不足」「旧システムのドキュメント紛失及び開発者退社により情報が皆無」「構造がそのままのため設計フェーズが省略される」「クライアント及びサーバーに使用するアプリケーションの限界」「ついで、にさせられる機能増強」等、阿鼻叫喚の地獄絵図が待ち受けるため気を付けること。
// 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();
}
}
}
}
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(); } } } }
「みだし」に含まれているページ
「解説」に含まれているページ
「サンプルプログラムとか」に含まれているページ
- (参照している単語はありません)