広告

■□■□■□■□■□■□■□■□■□■□■□■□■□■□■
                      2013年10月25日

   Java総合講座 - 初心者から達人へのパスポート
                 2009年11月開講コース 067号

                                セルゲイ・ランダウ
 バックナンバー: http://www.flsi.co.jp/Java_text/
■□■□■□■□■□■□■□■□■□■□■□■□■□■□■


-------------------------------------------------------
<お知らせ>
2013年開講コースは、ただいま準備中です。もう少しお待ち
ください。2013年開講コースではAndroidのアプリ開発など、
最近需要が急増しているテーマも含め、最新の技術を取り込
んでコース内容を刷新して行きます。
どうぞご期待下さい。

・このメールマガジンは、画面を最大化して見てください。
小さな画面で見ていると、不適切な位置で行が切れてしまう
など、問題を起すことがあります。
・このメールマガジンに掲載されているソース・コード及び
文章は特に断らない限り、すべて筆者が著作権を所有してい
ます。また、これらのソース・コードは学習用のためだけに
提供しているものです。
-------------------------------------------------------


========================================================
◆ 01.ネットワーク系のプログラミング
========================================================


今回から、ネットワーク系のプログラミングに入っていきましょう。
これは、まさにJavaが一番よく使われている分野であり、さまざま
な形態のネットワーク系プログラムがJavaで作られています。

ネットワーク系のプログラムは通常、クライアントとサーバーの
2種類で構成されます。
サーバー(server)というのは何らかのサービスを提供するプロ
グラムのことで、クライアント(client)というのはサーバーに
サービスを要求するプログラムのことです。

サーバーのコンピューターもクライアントのコンピューターもイン
ターネットやLANなどのネットワークにつながっており、ネットワー
クを経由して互いに通信します。
すなわち、クライアントはネットワークを経由してサーバーに要求
を行い、サーバーは要求に応じてサービスを実行して結果をクライ
アントに返します。
(なお、しばしばサーバーのプログラムが入っているコンピューター
自身をサーバーと呼ぶことがあり、クライアントのプログラムが入っ
ているコンピューター自身をクライアントと呼ぶことがあります。)



たとえば、Webサーバー(またはWorld Wide Webサーバー、または
WWWサーバー、またはHTTPサーバー)と呼ばれているプログラムは
Webのページを提供するサーバーであり、一方、Webブラウザーは
WebサーバーからWebページを取得して表示するクライアントのプロ
グラムです。

Javaのサーブレット(Servlet)やJSP(JavaServer Pages)と呼ば
れるプログラムはこのWebサーバー上で実行されるプログラムです。

サーブレット(Servlet)やJSP(JavaServer Pages)の機能はどちら
かというと企業向けの機能なので、Java EE(Java (Platform)
Enterprise Edition = 「Javaの企業版」みたいな意味)という
JavaのAPIによって提供されています。(Java EEは以前はJ2EEという
表記をしていましたが、現在はJava EEという表記に変わっています。)
Java EEを使うと、ネットワークでつながった複数のコンピューターで
構成される大規模なシステムを安全性(セキュリティー)を考慮しな
がら構築することができます。

したがって、これから段々と企業の基幹業務などの大規模なシステム
開発のお話にも入っていきます。



それでは、まず最初にサーブレットのお話から始めましょう。

Webサーバーの一番基本的な機能は、要求されたWebページをクライア
ント(Webブラウザー)に渡すことですが、ほとんどのWebサーバーは、
さらにCGI(Common Gateway Interface)と呼ばれる機能を持っており、
Webブラウザーからの要求に応じてプログラムを実行することもできま
す。この場合は、プログラムの出力内容をWebブラウザーに返します。
検索サイトやインターネット上のショッピング・モールなどは、この
CGIのプログラムによってユーザーの要求に応じた処理を行い、処理結果
をWebページとして出力してきます。

このCGIのプログラムには、UNIXのスクリプト言語やC言語など様々な言語
が使われてきました。特にPerlというスクリプト言語が一番よく使われて
きました。
さらに最近では、PHPという言語に人気があります。

こういったWebサーバー上で実行されるプログラムをWebアプリケーション
と呼ぶことがあります。

Javaでは、Webアプリケーションを作れるようにするためにサーブレット
(Servlet)と呼ばれる技術が開発されました。

アプレット(Applet = Application + let)がクライアント(Webブラウ
ザー)側で実行されるJavaのプログラムであるのに対し、サーブレット
はサーバー側で実行されるJavaのプログラムなのでServletというふうに
Server + letから名づけられました。
Appletと同じく、letがつくと小さいというイメージが付きまといますが、
実際には大きさには関係なくServletと呼ばれます。

サーブレットはCGIのプログラムと同じくWebサーバー上で実行されますが、
CGIとは別の仕組みで実行されます。


なお、プログラムは通常「プロセス(process)」と呼ばれる単位で起動
&実行され、CGIのプログラムも呼び出されるたびにプロセスとして起動
されます。

それに対し、サーブレットは、呼び出されるたびに(プロセスではなく)
スレッドとして起動されます。
プロセスの起動には随分負荷がかかるのに比べて、スレッドの起動には
あまり負荷がかからないので、サーブレットのほうがずっとパフォーマ
ンス(性能)がいいのです。
特に世界中の多くの人からアクセスされるような人気のあるWebサーバー
になってくると、この差は歴然としてきます。
(なお、現在はCGIのほうも改良が進んで性能が向上したものが出現して
おり、また、サーブレットはパフォーマンスはいいけれどメモリーをより
多く使うという欠点があります。しかし、アクセス数の多い人気のある
Webサーバーでは、やはりサーブレットを使ったほうが有利です。また、
サーブレットを含めたJ2EEの技術を使うと、スケーラブル(規模の伸縮
が自由)で変更の容易な柔軟なシステムが組めるという点でも有利です。)

というわけで、CGIのプログラムよりもサーブレットを使ったほうがいい
のですが、ただし、サーブレットは普通のWebサーバーで実行できるわけ
ではありません。
サーブレットを実行するためには、Webサーバーにサーブレット・コンテナー
あるいはWebコンテナー(Web Container = サーブレットを動かすエンジンの
ようなもの)と呼ばれる機能が組み込まれている必要があります。

Webコンテナーが組み込まれたWebサーバーには、有料のものもあれば無料
のものもあります。

無料のもので一番有名なのはオープン・ソースのTomcatです。
というわけで、あとでTomcatをインターネットからダウンロードしてイン
ストールする方法と使用方法を説明いたします。

実は、Tomcatはそれ自身がJavaで作られたWebサーバーです。これは元々
Apacheというオープン・ソースのWebサーバーを開発していた組織「The
Apache Software Foundation( = Apacheソフトウエア財団)」
   http://www.apache.org/
が作ったもので、元々から提供しているWebサーバー(Apache HTTP Server)
とともに定評があり、本番運用でも安定稼動に実績があります。

Apacheソフトウエア財団は現在ではWebサーバー以外にも非常に多くの
オープン・ソースのソフトウェアを開発しており、Java関連のソフト
ウエア業界でも貴重な存在となっています。
そしてApacheという名前も現在ではそれらのオープン・ソース・
ソフトウェアに対するブランドのような存在になっています。
(例えばApache Tomcatのように個々のソフトウエアの名前の先頭に
Apacheを付けて呼んだりします。)


ところで、サーブレットにしろ他のネットワーク通信の仕組みにしろ、
Javaで提供されているネットワーク系の機能は基本的にはTCP/IPという
プロトコルを使ったものです。


はい。では、プロトコルについてごく簡単に説明しておきましょう。

トランシーバーなどの無線機では、受信モードと送信モードをスイッチ
で切り替えなければなりません。このため、話終わったときには「どうぞ
(英語ではover)」と言うことによって、送信と受信を切り替えるタイ
ミングであることを相手に伝えるのがルールになっています。この手順を
間違えて、お互いが同時に送信しようとしたり同時に受信しようとしたり
したのでは、通信が成り立ちません。
もっとも人間が通信している限りは多少は融通がききますから、多少ルール
を破っても何とかなります。でも、機械同士が通信する場合には厳格に
ルールを守らなければうまくいきません。
インターネットなどの通信網の世界では、コンピューターや通信機器が
うまく通信を行えるようにするために、どんな信号(データ)をどういう
タイミングでやり取りするかというルール(規約)が細かく厳密に決めら
れています。
このような取り決め(規約)がプロトコルと呼ばれるものです。


Javaの世界でネットワークと言えば、特に断らない限りTCP/IPプロトコル
を使ったネットワークを意味します。これには、インターネットやLAN
(Local Area Network)が含まれます。

TCP/IPとは、TCP(Transmission Control Protocol)やIP(Internet Protocol)
などの複数のプロトコルを一まとめにして呼ぶ総称です。

したがって、TCP/IPの中に含まれる個々のプロトコルについて、外観して
おきましょう。

まず、TCP/IPは大きく分けて下図のような4つの階層のプロトコルから
構成されています。
これらのプロトコルのうち、上の層のプロトコルだけを単独に使って通信
することはできず、上の層のプロトコルは必ず下の層のプロトコルも利用
しています。
なお、括弧内に記述したものはその層における代表的なプロトコルの名前
です。

+-------------------------------------+
 アプリケーション層(FTP, SMTP, HTTP)
+-------------------------------------+
 トランスポート層(TCP, UDP)
+-------------------------------------+
 インターネット層(IP)
+-------------------------------------+
 ネットワーク・インターフェース層
+-------------------------------------+


(1) ネットワーク・インターフェース層
このプロトコルは、通信のための物理的な装置(ネットワーク・インター
フェース・カードなど)を制御して送信/受信を行うためのものです。
物理的な装置に依存します。

(2) インターネット層
IP(Internet Protocol)によって、指定されたホスト(host)へデータを
送り届ける働きをします。
ここでいうホストとは、IPアドレスを持つコンピューターのことを意味し、
IPアドレス(IP AddressまたはInternet Address:インターネット・アド
レス)とは、ネットワークを電話網に見立てたときの電話番号に相当する
番号です。
IPアドレスを持っていないコンピューターはTCP/IPで通信することはでき
ません。
ちなみに、皆さんのパソコンのIPアドレスを知りたいときは、コマンド・
プロンプトで
ipconfig
というコマンドを入力してみてください。

(3) トランスポート層
普通は、TCP(Transmission Control Protocol)かUDP(User Datagram Protocol)
のどちらか一方のプロトコルを使って通信を行うことになります。
このとき、インターネット層ではIPによってIPアドレスが明示されるので、
どのコンピューターと通信を行うのかはIPのレベルで明確になっているの
ですが、そのコンピューターの中のどのプログラムと通信を行うのかは明確
にはなっていません。そこで、TCPやUDPでは、ポート番号(Port Number)
という番号によって、特定のプログラムを指定するようになっています。

ポート番号にはどのようなものがあるか(すでに使用されている、もしくは、
予約済みのポート番号など)については

http://www.iana.org/assignments/port-numbers

にリストされていますので、必要な人は参照してください。

なお、我々が身内の間だけで自由に使ってよいのはThe Dynamic and/or
Private Portsと呼ばれているもので、上記のリストの先頭でも説明されて
いるように、現在そのポート番号は49152から65535までです。

トランスポート層のプロトコルのうち、TCPは、信頼性を保証するプロトコル
です。
その保証のために、通信相手と接続できたことを確認してからデータを送受信
します。
また、送信側が送り出したのと同じ順番で受信側がデータを取り出せることを
保証しており、消失したデータ(パケット)があった場合は、自動的に再送
することによって、確実に相手に届くようにします。

一方、UDPは、信頼性を保証しないプロトコルです。相手との接続を確認
することなく、いきなりデータを送りつけ、相手にデータが届いたかどうか
の確認もしません。
また、送信側が送り出したのと同じ順番で受信側がデータを取り出せる
という保証もありません。
これでは、TCPより劣っているだけじゃないか、と思われるかもしれませんが、
余計なことをしない分、TCPよりも転送速度が速いというのがメリットです。
ラジオ放送みたいに一方的にデータを送り出して、相手がちゃんと受信でき
ているかどうかは気にしない、という形式の通信に向いています。

(4) アプリケーション層
アプリケーション・プログラムが使用するプロトコルです。
有名なものには、ファイル転送のプログラムが使用するFTP(File Transfer
Protocol)、電子メールのソフトが使用するSMTP(Simple Mail Transfer
Protocol)、Web(World Wide Web)が使用するHTTP(Hyper Text Transfer
Protocol)などがあります。これらのプロトコルは、トランスポート層では
TCPを使用しています。
以前お話したNetwork Time Protocol(NTP)もこの層に属します。
ちなみに、FTP、SMTP、HTTP、NTPは特定のポート番号が割り当てられていま
すから、先ほどのリストで確認してみてください。


ちなみにTCP/IPにはソケット通信という機能があり、これを使うとファイル
へ入出力するようなイメージでデータの送受信を行うことができます。
ソケット通信にはTCPを使用する方法とUDPを使用する方法の2種類があります。

Javaでもソケット通信のためのAPIが提供されていますので、これらを使った
簡単なプログラムを作ってみましょう。TCPやUDPの振る舞いを理解しやすく
なります。

では、まず、TCPを使うほうのプログラムです。
(今回は、プロジェクトやパッケージの名前は指示しませんので、自分で
自由に付けてみて下さい。)

下記のようなサーバーのプログラムを作ってみましょう。
--------------------------------------------------------
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;

public class TcpSocketServer {

   public static void main(String[] args) {
      ServerSocket server = null;
      Socket socket;
      int[] sendData = new int[3];
      for (int i = 0; i < 3; i++) {
         sendData[i] = i + 1;
      }
      OutputStream sOut;
      InputStream sIn;
     
      try {
         server = new ServerSocket(49152, 200);
         while (true) {
            socket = server.accept();
            sOut = socket.getOutputStream();
            for (int i = 0; i < 3; i++) {
               sOut.write(sendData[i]);
            }
            sOut.close();
            socket.close();
            socket = server.accept();
            sIn = socket.getInputStream();
            int c;
            while((c = sIn.read()) != -1) {
               System.out.print((char)c);
            }
            System.out.println();
            sIn.close();
            socket.close();
         }
      } catch (IOException e) {
         e.printStackTrace();
      }
   }

}
--------------------------------------------------------

また、下記のようなクライアントのプログラムを作ってみましょう。
--------------------------------------------------------
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
import java.net.UnknownHostException;

public class TcpSocketClient {

   public static void main(String[] args) {
      Socket socket;
      InputStream sIn;
      OutputStream sOut;
     
      try {
         int c;
         socket = new Socket("127.0.0.1", 49152);
         sIn = socket.getInputStream();
         while((c = sIn.read()) != -1) {
            System.out.print(c);
         }
         sIn.close();
         socket.close();
         socket = new Socket("127.0.0.1", 49152);
         sOut = socket.getOutputStream();
         String sendData = "Data1";
         for (int i = 0; i < 5; i++) {
            sOut.write((int)sendData.charAt(i));
         }
         sOut.close();
         socket.close();
      } catch (UnknownHostException e) {
         e.printStackTrace();
      } catch (IOException e) {
         e.printStackTrace();
      }
   }

}
--------------------------------------------------------

このソース・コードの説明は次回行います。
ちなみに、上記のソース・コードの中の"127.0.0.1"は、自分自身のコン
ピューターを表すIPアドレスで、ループバック・アドレス(loopback address)
と呼ばれているものです。(ついでに、その右の49152というのはポート番号
です。)
つまり、ここでは、サーバーとクライアントが同一のコンピューター内で
実行されることを想定しています。もし、サーバーとクライアントをLAN
などでつながった別々のコンピューターに入れて実行するのであれば、
"127.0.0.1"の代わりに正しいIPアドレスを指定してください。

なお、これらのプログラムを同一のコンピューターで実行する時には、
少なくとも一方(たとえばサーバーのほう)はコマンド・プロンプトから
実行してください。
Eclipseにはコンソールが一つしかないので、Eclipseで両方のプログラムを
実行しても両方の結果は見られません。

なお、サーバーのプログラムは一度起動したら無限ループでクライアント
からの要求を待ち続け、そのままでは停止することはありません。
サーバーを停止させたいときは、コマンド・プロンプトならCtrl + Cのキー操作、
あるいはEclipseならコンソールの赤い正方形のアイコンのボタンをクリックし
てください。


何か、わからないところがありましたら、下記のWebページまで質問をお寄せ
ください。


(続く)



========================================================
◆ 02.Java(文法等)解説 [JavaBeans (2)]
========================================================

[JavaBeans (2) プロパティー<1>]

プロパティーには下記の4種類があります。

(1) シンプル・プロパティー(simple property)
一番基本的なプロパティーです。値は1つだけで、値の変更は他のBean
から独立して行われます。

(2) 結合プロパティー(bound property)
値が変更されると他のBeanに通知されるプロパティーです。複数のBean
の間でプロパティーの値を合わせておきたい場合などに使用します。

(3) 制約付きプロパティー(constrained property)
値の変更が他のBeanによってチェックされるプロパティーです。不適切
な変更を行おうとしたときに他のBeanから拒否できるようにしたい場合
などに使用します。

(4) インデックス・プロパティー(indexed property)
配列によって複数の値を含むプロパティーです。


(続く)



以上、今回は
┌───────────────────────────┐
・サーバーとクライアント
・プロトコル
・TCP/IP
・TCPとUDP
・JavaBeansのプロパティー
└───────────────────────────┘
を学習しました。
では、また。



┏━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
★ホームページ:
      http://www.flsi.co.jp/Java_text/
★このメールマガジンは
     「まぐまぐ(http://www.mag2.com)」
 を利用して発行しています。
★バックナンバーは
      http://www.flsi.co.jp/Java_text/
 にあります。
★このメールマガジンの登録/解除は下記Webページでできます。
      http://www.mag2.com/m/0000193915.html
★このメールマガジンへの質問は下記Webページにて受け付けて
 います。わからない所がありましたら、どしどしと質問をお寄
 せください。
      http://www.flsi.co.jp/Java_text/
┗━━━━━━━━━━━━━━━━━━━━━━━━━━━┛

Copyright (C) 2007-2013 Future Lifestyle Inc. 不許無断複製