集中企画

石川和也

Javaのすべてその実像に迫る

206 INTERNET magazine 1996/5

いま「Java」が注目されている。多くのインターネットの利用者が使っている「ネットスケープナビゲーター2.0」
でも採用されていることは有名だし、さらに米国マイクロソフト社がライセンス供与を受けている。また、先月号で紹介した米国オラクル社が提唱している「ネットワークコンピューター（NC）」もJavaを基本とすると発表している。
そもそもは米国サン・マイクロシス
テムズが開発した開発者向けの「プログラミング言語」がなぜこれだけ社会的に騒がれるのだろうか？
今月の集中企画では、Javaの実像に迫ることにしよう。
まずパート1ではプログラムを書かない人でもJavaのなんたるかを理解していただき、パート2ではプログラ
ミング言語としての特徴を解説、そしてパート3では開発環境を紹介、パート4では実際のアプレットを作ってみることにしたい。

インターネットマガジン／株式会社インプレスR&D©1994-2007 Impress R&D

part 1
Javaはなぜこれほどまでに話題になるのか「Java」はワープロや表計算ソフトのよう語自体は開発者が使うもので、逆にいえば、た。これは、従来CD-ROMを使ったマルチなアプリケーションではなく、アプリケーシ

Java言語を知らなくても利用者はアプレッ

メディアタイトルを制作するためのアプリョンソフトを開発するのに使う「プログラトを使うことができる。

ケーションである「ディレクター」で開発

ミング言語」の1つだ。プログラミング言語

したデータ（作品）をWWWブラウザー上

Javaはアニメーションのためので再生するための「ネットスケープ・プラ

染みがないと思うので、ここではまず、プ

言語ではないグイン」だ。ディレクターなら、難しいプ

ログラミング言語とはなにかということから◆◆◆◆◆◆

ログラミングなしに、絵を動かしたり、音と一言でいっても、多くの読者の人には馴

解説し、いま、なぜJavaが注目されているのかについて、アプローチしていこう。

もし、すでにネットスケープナビゲータを入れたりできる。

ー2.0を使っているようなら、http://www.

もちろん、ショックウェーブなどを使わjavasoft.com/を見てみよう。ここにはJava

なくてもネットスケープナビゲーターの機能

Javaはプログラム開発のための「言葉」

言語で作られたアプレットのデモンストレの「プッシュプル」の機能を使い、コマ送◆◆◆◆◆◆

ーションが用意されている。確かにいままりのイラストを次々と送り出して、あたか

パーソナルコンピュータの黎明期には、でのWWWブラウザーの中ではこうしたアも絵が動いているかのようにもできる。

「パソコンを使う」ということは、「プログニメーションを使うことはできなかったか

もし、WWWブラウザー上で絵を動かしラムを書く」ということでもあった。しから、初めて見た人はきっと驚くことだろう。

たいだけなら、Java言語なんて難しいもの

しアプリケーションソフトのパッケージが登Java言語がこれだけ有名になった一因は、には手をださず、ショックウェーブを使う

場し、一般の利用者はプログラムなど書け

いままでのWWWではできなかった表現が方法を選んだほうがいいだろう。Java言語

なくても、コンピュータを使えるようになできるようになったことだろう。しかし、の本来の目的はそこにはない。

ってきた。

Javaはあくまで「プログラミング言語」な

それにもかかわらず、Java言語というプ
ログラミング言語が注目されている。それはなぜなのだろうか？

WWWの可能性を拡大するJava

ので、誰でも簡単にプログラムを作れると◆◆◆◆◆◆

いうわけではない。
最近では、ネットスケープナビゲーター

Java言語はネットワークを前提としたコ

プログラミング言語とは、コンピュータ

で絵を動かすものとして「ショックウェー

ンピュータ環境に劇的な革新をもたらすとの利用者ではなく、プログラムを開発する

ブ・フォー・ディレクター」という米国マいわれている。なぜC言語やC++言語といエンジニアがプログラムを作成するのに使

クロメディア社の開発したソフトが登場しったプログラミング言語の一種といえるJava

Java アプレットのデモンストレーション。多くの人がWWW上のアニメーション制御機能だと勘違いした

ショックウェーブの作品例。ディレクターはあくまで画面指向のマルチメディア作品の開発環境だ

j http://www.nasoft.com/

j http://www.jtnet.ad.jp/WWW/SANRIO/
s_gallery/xo_demo.html

う「言葉」だ。おおざっぱにいえば、この「言葉」は人間の言葉に近い「コンピュータ語」だ。
一般にアプリケーションを開発する人がもっともよく使っているプログラミング言語
は「C（シー）言語」や「C++（シー・プラスプラス）言語」というもので、この言語を使いこなすには、それなりのコンピュータの知識が要求される。
しかし、C言語について知らなくても、ワープロや表計算ソフトが使えるように、Java言語について知らなくても、Java言語で作成されたアプリケーション（アプレット）を使うことはできる。つまり、Java言インターネットマガジン／株式会社インプレスR&D©1994-2007 Impress R&D

INTERNET magazine 1996/5

207

なければならなかった。

言語がこれだけ注目されるのだろうか？ そ着目した。つまり「WWWで文字や画像のれに答えるまえに、WWWの仕組みについ代わりにプログラムを送ったらどうだろう？

この理由はプログラムはCPUが理解できてもう一度触れておくことにしよう。

そして送ったプログラムがWWWブラウザても、表示画面の性能が違うなど、ハード

すでに多くの人はネットスケープナビゲ

ーの中で動いたとしたら…」という極めてウェアの違いもあるので、同じプログラム

ーターなどのWWWブラウザーを使って世単純なことだった。そこで、サン・マイク

は動かなかったからだ。もちろん違うCPU

界中のコンピュータに入っている情報を見ロシステムズ社内で研究開発が進んでいたを使っているマシン、たとえばマッキント

ることができていると思う。WWWはイン情報家電向けのシステム（グリーンプロジ

ッシュでは動かない。しかし、ウィンドウ

ターネット上で情報を共有する単純で効果

ェクトといわれていた）を開発するための、ズが登場して問題は改善された。同じイン的な手段を提供したが、WWW用の文書を手軽で移植性や信頼性に優れたプログラミテル社のCPUを使っていれば、ハードウェ

作るのに使われるHTML（ハイパーテキス

ング言語を組み込むことにしたのだ。サアの違いは関係なくなり、「ウィンドウズ

ト・マークアップ・ランゲージ）は、論文

ン・マイクロシステムズは、この言語をブ用」というアプリケーションを買えば、ウや書籍のような「文書」の形での情報提供

ラシュアップし、移植性や信頼性などを実ィンドウズの動いているマシンならどれでもを中心に考えられていたために、表現でき現した「Java言語」を開発した。

動くようになった。
しかし、ウィンドウズ用のアプリケーシるのは「固定された文書」に限られていた。
もちろん、ヘルパーアプリケーションをJava言語を使えばョンは相変わらずマッキントッシュでは動使えば動画や音声も再生できたが「動いてウィンドウズでも、マックでも動くかないし、マッキントッシュ用のアプリケいる」動画の内容はすでに1度録画され、固◆◆◆◆◆◆

ーションはウィンドウズでは動かない。もちろんUNIXとの関係も同様だ。

定された内容である。書籍に代表されるよMS-DOS時代のコンピュータを知っていうに、これまでの文書は作成されたときとる人なら、アプリケーションソフトウェア

インターネットには、いろいろなコンピ

同じ内容で固定されている。株価情報のよを買うときに、「MS-DOS用」というだけ

ュータがつながっていることはご存知のとうに常に更新される内容の文書には「固定ではなく、NECのPC-9801シリーズ用とか、おりだ。文字や画像は、あらかじめ決まっされた文書」では役に立たない。

IBM用とか、東芝のダイナブック用とかとた形式があるので、その形式の文字や画像

いうように、対応するマシンによって選ばを使っているページなら、どのようなマシ

しかし、ネットスケープナビゲーターにJava言語を解釈し、動かすエンジンが組み込まれた結果、文書を表現する以外にアプ
リケーションプログラムを実行することが可能になり状況に応じて変化する「ダイナミック」な文書が表現できるようになった。

サーバーB

さらにその実行環境、つまりWWWブラウ
ザーのウィンドウの中が、ウィンドウズやマッキントッシュなどのデスクトップのよう

サーバーAとしての移植性と信頼性

.

N

RI
SP

すで
・
・
・

Javaの使命はプログラム言語

..

G

.

にプログラムが動く環境になったのだ。

春◆◆◆◆◆◆
WWWはネットスケープナビゲーターなどのブラウザーからの要求に応じて、対応する文書をネットワークを通じてブラウザーに送る。ブラウザーが要求するのは文字

クライアント

Jav a
アプレット

や画像などが中心だが、扱うのはあくまでファイル単位になっていた。
米国サン・マクロシステムズ社はここに

208 INTERNET magazine 1996/5

図1：WWWは世界中にちらばる文字データや画像を配送する仕組みだ。この仕組みを使ってプログラムが配送できたら画期的だ

インターネットマガジン／株式会社インプレスR&D©1994-2007 Impress R&D

ンやオペレーティングシステムを使っていてやハードウェアなどに依存しないのは、Java

検索、文字の配置などのさまざまな機能をも同じように表示できる。

言語で作られたアプレットが「バイト・コ持っているが、これらの機能をそれぞれ個プログラムもそれと同様に、1つのプログード」というJavaの「エンジン」が理解す

別の「部品（パーツ）」として切り分け、ラムだけ作るだけで、インターネットにつる形式（これを「中間言語」という。人間

必要な部分を読み込んで実行させることがながっているどんなハードウェアを使っていの言葉でもなければ、コンピュータが直接できる。そのため、ハードウェア自体もたても同じように動いたら画期的だ。そうす理解できる言葉でもない「中間的な」言語

くさんのメモリーやディスク容量を必要とればユーザーは便利になるし、エンジニアになっているからだ）になっているからだ。

しない。

も同じ機能のアプレットを複数の機種に対応させるために作り替えなくてよい。

また、Java言語で作成されたアプレット

たとえばJava言語はエンジンであるインは「必要に応じて、部品化されたプログラ

タープリターのサイズが100キロバイト程

インターネットにつながるのは、パソコ

ムをネットワークでダウンロードして、実行度、標準的なクラスライブラリという部品

ンやワークステーションだけではない。今後する」という機能があるので、関係するプを含めても500キロバイト程度とコンパクト

はさまざまな装置のつながる可能性がある

ログラムの全部を一度にダウンロードするになっている。そのため、最近話題の500ので、なおさらどんなハードウェアでも動くのではなく、必要に応じて必要なプログラ

ドルコンピュータなどでも動作する可能性

ことが望まれるのだ。

ムだけをダウンロードして、動かすことがが十分にあるといわれている。

できる。たとえばワープロソフトは編集、Javaは「言語」とそれを解釈する
PC-9801シリーズ用
アプリケーション「エンジン」で構成される

IBM PC用
アプリケーション
同じアプリケーションはが動かない◆◆◆◆◆◆
そこでJ a v a 言 語 の意 味 が出 てくる。
「Java」は、プログラムを書く「Java言語」■ MS-DOS時代とJava言語で作られたアプレットを実行するための「エンジン（インタープリターと

PC-9801シリーズ

IBM PC

同じアプリケーションはが動かないいう）」で構成される。エンジンはネットス
ケープナビゲーターなどのアプリケーションにあらかじめ組み込まれており、その組み込まれたところにアプレットがロードされる同じ
アプリケーションが動く

ウィンドウズ 95

MacOSと、そのアプレットが動きだす。
Java言語が注目されているのは、このよ

ハード

ハード

ハード

うにJava言語を使ってアプレットを1つだけ
PC-9801シリーズ

作れば、マッキントッシュだろうと、ウィ

組み込まれていれば、どのような環境でも動かすことができるというところだ。
現在はネットスケープナビゲーターやHotJavaブラウザーなどの一部のアプリケーシ

IBM PC

ウィンドウズマシン

ンドウズだろうと、UNIXだろうと、Java言語のアプレットを動かす「エンジン」さえ■ウィンドウズ／マッキントッシュ時代

同じアプレットが動くJava
インタープリンター
ネットスケープ
ナビゲーターョンにしか組み込まれていないが、電子手帳などの他の装置でも、エンジンを組み込めば同じアプレットが動くことになる。

MacOS

ウィンドウズ 95

ハード
ハード
PC-9801シリーズ

Javaのアプレットはコンパクトだ◆◆◆◆◆◆
このように、オペレーティングシステム

ハード

ハード

IBM PC

マッキントッシュ

電子手帳など専用機

ウィンドウズマシン

図2：Javaはハードウェアやオペレーティングシステムに依存しない
ので、インターネットでプログラムを配送するのに向いている

インターネットマガジン／株式会社インプレスR&D©1994-2007 Impress R&D

INTERNET magazine 1996/5

209WWWとの組み合わせでもう1つの理由は、インターネットとそれがれているのだろうか？」。

威力を発揮する

大きく分けると2つの理由が考えられるを使うWWWやブラウザーという仕組みを◆◆◆◆◆◆だろう。1つは、いままで説明したように、使ってアプリケーションを配信し、しかもJava言語は、まず「HotJava」というJavaのインタープリターを採用したWWW

そのアプリケーションがさらに通信をしな

WWW ブラウザーに組み込まれた。このブラウザーやネットワーク機能をもったコ

がらいろんな仕事をすることになると、いHotJavaというブラウザーはサン・マイクロンピュータがあれば、ネットワークからアプ

ままで想像していなかったような利用方法

システムズ社が開発したWWWブラウザー

レットを読み込んで実行できるようになるが開発されるのではないかという期待だ。

だ。HotJava自体も大部分がJava言語で作と、現在繰り広げられている「ウィンドウ

一方で、このような思惑ばかりが先行し成されている。HotJavaはWWWが備えてズ対マッキントッシュ」というような論争てしまい、その周囲が異様に盛り上がりす

いる「 ネットワーク上 での部 品 の識 別に終止符を打ち、どちらでも好きなほうをぎているという意見もある。そもそもこの（URL）」機能と「ネットワーク経由での配選べばアプリケーションが共通になってし言語を開発したサン・マイクロシステムズ

送（ハイパーリンクとHTTP）」機能を活用まう「かもしれない」ということだ。

のビル・ジョイ氏はあくまで「C言語、C++して、すでにある環境下で手軽にネットワ

つまり、アプリケーションを動かすため言語に対抗できる新しいプログラミング言ークコンピューティングが実現できることの基盤となるオペレーティングシステムで語」と位置づけていたものが、インターネ

を具体的に見せた。ネットスケープコミュ

大きなシェアをとったマイクロソフトが業界ットでアプレットを配布するというアイデ

ニケーションズ社はこの可能性にいち早くの覇権を握ったように、Javaというアプリ

アにより、いっきに表舞台に立ってしまっ

気付き、自社の「ネットスケープナビゲー

ケーション実行環境（つまりはオペレーテた感もある。

ター」へJava言語を取り込むことを決めた。

ィングシステムと同じくらいの意味を持つ

結果として、インターネットの可能性をもちろん、Java言語はWWWとだけ組みということ）で大きなシェアを握った会社

拡大するものではあるので、大きな期待は合わせて利用されるための言語ではないががインターネット時代のコンピュータ業界

よせるものの過剰に騒ぎすぎることは逆効

汎用的なネットワークを使った配送システの覇権を握る可能性があるということを意果でもあるだろう。

ムであるWWWと世界的な標準となってい味している。

るネットスケープナビゲーターを従来のハードウェアやオペレーティングシステムなどと同様に「プラットフォーム」と見立て、下さ歌ってその上で動作するネットワークアプリケー

い・・・

ションを動作させることはJava言語にとっ図3：Java言語のアプレットとインタープリターの関係。
Java言語で作られたアプレットはそれだけでは実行できず、クライアント側にJava言語のインタープリ
ターが入っている必要があるては有効なアプローチだろう。
つまり、絵を動かして、音を鳴らすだけではなく、コンピュータではプログラムさえ書けばなんでもできるように、Java言語でもプログラムさえ書けば、なんでもできるわけだ。プログラミング技術自体は難しい

話し手（Javaのアプレット）

u
ng
ld yo
Wou ing a So
S

が、最初に紹介したショックウェーブやプ
ッシュプルを使うよりも高い柔軟性と可能

♪

♪

♪

性があるといえる。いずれはネットスケー
プナビゲーターの中でワードプロセッサーが動くようになるかもしれない。

通訳者（インタープリンター）

Java言語が騒がれる理由とは聞き手◆◆◆◆◆◆（Java対応のブラウザ）

では、いよいよ最初の疑問に答えることにしよう。「Java言語はなぜいまこれだけ騒210 INTERNET magazine 1996/5

インターネットマガジン／株式会社インプレスR&D©1994-2007 Impress R&D

part 2
プログラミング言語としての特徴
Java言語はオブジェクト指向言語として新構造体、共用体がない

Java言語ではこれらの基本データ型のサたに開発された。文法的にはC言語やC++◆◆◆◆◆◆

イズを明確に規定するとともに、格納され言語に非常によく似ている。現在、多くの

また、複数のデータをひとまとめにしてるデータフォーマットについても規定してアプリケーションプログラムやシステムがC言管理する構造体（structやunion）もない。

いる。このなかで文字型が16ビットで格納

語やC++言語を使って開発されているので、オブジェクト指向ではデータとその操作されるコードセットがユニコード（unicode）

多くのプログラマの人々にとっては馴染み（メソッド）を組にしてオブジェクトとしてという点はCプログラマ（特にUNIX）が戸やすいだろう。ここではJava言語とC言語、定義している。構造体を作成するというこ

惑う点かもしれない。また、「unsigned

C++言語との違いについて見てみよう。

とは、新しいデータ型を作り出すことにな（符号なし）」という修飾詞がない。そのたるから、同時にそのデータを操作するメソ

め右シフト演算（>>）時にキャリアビット「ポインター」がない◆◆◆◆◆◆

ッドを作成し、それらをクラスとして合わを無 視 する符 号 なしの右 シフト演 算 子

せて定義する。

（>>>）が追加されている。

Java言語にはポインターがない。そのため、メモリーをアドレス指定によって直接規定された基本データ型は操作できない。ポインターはプログラミ

定義された文字列◆◆◆◆◆◆◆◆◆◆◆◆

ングの柔軟性を向上させるが、弊害もある。

C言語では基本的なデータタイプ（int、C言語では文字列は文字データの配列

ポインター操作を誤り、配列の範囲外に

char、short、logn、float、doule）のサ（NULL文字で終了する）として定義されアクセスしてしまうことはよくあることだ。

イズは言語仕様上は明確に決められていなている。そのため、文字列の操作はメモリ

また、初期化していないポインターの内容

かった。これはC言語でそれぞれのハードウ

ー上に並んだ配列に対する操作として実現

でアクセスをし、予期しないメモリー領域

ェアアーキテクチャにとって自然なデータされる。文字列の複製や連結を実現するたを破壊してしまうこともある。このようなサイズを提供できるというメリットがあっ

めには文字配列に対する処理（strcpy, str-

ポインターに起因するバグはコンパイラー

たが、一方で移植性の悪いプログラムを生cat等）をする必要があった。

も検出しないし、実行時のスタックやメモ

む原因にもなった。特に最も頻繁に利用さJava 言語では文字列は「String」やリーの内容によってエラーが発生する場所

れるint型のデータサイズがCPUアーキテク「StringBuffer」オブジェクトとして定義さが違うので、問題の個所の特定が非常に困チャに依存するために、16ビットアーキテれる。これらのクラスでは文字列の複製や難だ。

クチャで設計されているウィンドウズと、32連結が定義されており、「＋」演算子によJava言語ではポインター操作自体をなくビットアーキテクチャが一般的なUNIX間って2つのString（StringBuffer）オブジェ

すことで、ポインター操作の誤りから発生でプログラムの移植をする場合に苦労の原クトを連結できる。さらに「＋」演算子でするプログラムのバグを未然に防止する。

因となっていた。

連 結 をする場 合 に整 数 型 の変 数 などは限定された型変換

表1：C言語とJava言語の比較◆◆◆◆◆◆

項目

ポインター同様に型変換（キャスト）もバグの温床になっている。Java言語では型
変換はサポートしているが、同一のクラス

C++言語

Java言語

ポインター

ある

ない

構造体

ある

ない（クラスを定義）

文字列操作

文字型の配列操作関数
strcat()String, StringBufferオブジュエクトの操作
str + str̲b

多重継承

ある

なし

から派生したクラス間での型変換に限定さアクセス制御static, auto

public, private, private protected,protectedれている。そして型変換の正当性はコンパ

ネットワークある

ある（セキュリティ制限有）配列

境界チェックなし

境界チェックあり

例外処理

signal（オプション）

try { 〜 } catch （例外）{例外処理}（必須）関数の引数可変長ANSIコンパイラは型のチェックを行う

メソッドで定義されたものだけ型と数が一致する必要ありイル時にチェックされ、不正な型変換はできない。

インターネットマガジン／株式会社インプレスR&D©1994-2007 Impress R&D

INTERNET magazine 1996/5

211

ンターによって操作する必要はない。

printf関数での出力書式指定と同様に対応（call by value）」で行われるので、データする文字列に変換して連結される。

はコピーして渡される。呼び出された関数

また、C言語では関数に渡す引数の数はまた、実行時に文字列領域をチェックすは常に複製されたデータを操作しているの自由だが、Java言語では関数（メソッド）

るので、領域外に不正にアクセスすること

で、引数はローカル変数（初期化された）

定義時に指定された型および数を持つ呼びも防げる。

と同様に扱える。呼び出し側の変数の内容

出ししか許可されない。定義されていないを変更させたい場合には、変数のポインタ

呼び出しをするとコンパイル時にエラーとーを引数として渡す。

なる。

ポインターを使わない関数呼び出し◆◆◆◆◆◆

Java言語では「参照呼出し（call[pass]

C言語では関数への引数は「値呼び出し

by reference）」で引数が渡されるのでポイ

part 3
Java言語のプログラムの開発環境
ここではJavaに興味を持たれた方が実際に動作するアプリケーションの構築もできる。

JDKの概要プログラムを作る際の手順について説明す

これを「スタンドアローン 」という。この◆◆◆◆◆◆

るとともに、自作のJavaアプレットやイン「スタンドアローン」のアプリケーションを

JDKは、Sunワークステーション（ソラターネットで提供されているJavaプログラム実行させるためには、Java言語で書いたプ

リス2.x）用、ウィンドウズ95/NT用、そを動作させるために必要な手順を説明する。

ログラムの実行環境であるJavaインタープ

してマッキントッシュ用という3つのプラッリターとともに動作させる。

トフォームが用意されている。

Javaプログラムの種類

このJDKには、Javaコンパイラーである◆◆◆◆◆◆

Javaアプリケーションの開発「javac」、デバッガーである「jdb」、そしてJava言語で作成するプログラムは大きく◆◆◆◆◆◆「jdoc」などが入っている。これらのツール

分けると2種類ある。1つは「アプレット」

Javaで書かれたプログラムは、いわゆるは「http://www.javasoft.com/devc-と呼ばれネットスケープナビゲーターやHot-「バイトコード」という中間言語，つまりマorner.html」でそれぞれのプラットフォー

JavaといったJava対応のWWWブラウザー

シンコードでもなければ、高級言語でもな

ムに対応したJDKを入手できる。

で動作するアプリケーションだ。アプレッ

い、その中間的な形式に変換され、仮想マ

トはJavaのインタープリターを組み込んでシン上で実行される。仮想マシンとは、

JDKのインストール

あるWWWブラウザーで動作するので、実CPUやオペレーティングシステムに直接は◆◆◆◆◆◆

行させるアプレット名や表示サイズ、引数依存しないプログラムの実行環境のことだ。

JDKを入手し、適当なディレクトリに展を指定するためのHTMLファイルを必要とそのためBASIC言語とは違い、プログラム

開したら、JDKを利用するための環境設定する。また、数値演算やデータベースへのを作成（編集）しながらの実行はできない。

をする。このなかで環境変数「CLASS-

アクセス処理などの一般的なプログラム処

C言語やC++言語などのコンパイラー言語

PATH」が設定がされていないと、コンパ理に加えて、描画や文字列の表示、マウスと同じように、ソースコードを書いたらコ

イル時や実行時に「クラスが見つからない」というエラーが発生する場合がある。

やキーボードからの入力処理といった画面

ンパイルをして、バイトコードに変換しな表示や利用者との対話をするアプリケーシ

ければならない。そのためのJavaの開発環ョンの開発ができる。

境としては、いくつかの商品が発売されはJavaアプリケーションというとWWWブ

じめているが、ここではサン・マイクロシ

ラウザー上で動作するアプレットが一般的

ステムズ社のJDK（Java Development Kit）

だが、WWWブラウザーがなくても単独ででの開発方法について説明しよう。

212 INTERNET magazine 1996/5

インターネットマガジン／株式会社インプレスR&D©1994-2007 Impress R&D

プログラム開発の手順◆◆◆◆◆◆

ンパイルをしてバイトコードに変換する。コとして定義する。スタンドアローンでは最

ンパイルは「javac」コマンドを使う。

初に起動されるクラスを識別するために
mainメソッドを書く必要があったが、アプ「アプレット」と「スタンドアローン」では開発手順は若干異なる。まず「スタンド

C> javac HelloWorld.java

レットではHTMLによって最初に呼び出されるクラスを指定しているのでmainメソッ

アローン」の開発手順から紹介しよう。
Javaでのプログラム開発はC言語での開発

この場合、ソースファイル名の拡張子はドを書く必要はない。その代わりにブラウと同じで、編集→コンパイル→テスト→実省略できず、また大文字と小文字は区別さ

ザによってアプレットが呼び出された場合行を繰り返す。

れるので注意が必要だ。

の処理や終了時の処理、さらには別のペープログラムの編集（作成）は一般的なテコンパイラーはクラス定義をバイトコー

キストエディタを利用する。ただし、ファドに変換した「クラスファイル」を作成す

イル名には決まりがあり、プログラムのソる。クラスファイルは各クラスの名前にースファイルはそのファイルに書いてあるク「.class」拡張子を付けたファイル名となる。

ラス名に拡張子に「.java」を付けたファイ

1つのJavaプログラム内に複数のクラスが定ル名になる。ファイル名での大文字と小文義されていた場合、コンパイラーはそれぞ

字 の区 別 は厳 格 に「 ある」。 S p i n i n g -れのクラス名を持つクラスファイルとして

Globe.javaとspiningglobe.javaは別のクラ

別々のファイルを作成する。

スを定義しているファイルとして扱われる。

Javaコンパイラーが作成したクラスファ

特にウィンドウズ95/NTの場合は注意が必

イルはCコンパイラーが作成したバイナリと要だ。

は異なり、できあがったバイトコードのフジに移動したときの処理などを書けるようになっている。
アプレットの「Hello World」プログラム
は下のリストのとおりだ。
コンパイルはつぎのようなコマンドラインで行う。
C> javac HelloWorldApplet.java

ァイルだけでは動かない。動かすためにはサンプルプログラム

Javaインタープリターを使って作成された◆◆◆◆◆◆

ファイルを実行させることになる。JDKにC言語を習ったときに最初に書いたよう入っているインタープリターは「java」コに、「Hello World」プログラムを書いてみマンドで起動でき、その引数としてクラスよう。これは説明するまでもないが、画面名を指定する（「.class」が付いたクラスフに「Hello World」という文字を表示する

ァイル名ではない）。

だけのものだ。
C> Java HelloWor
HelloWorld.javaclass HelloWorld {アプレットの作成

public static void main(String args[]) {◆◆◆◆◆◆
つぎにアプレットを作成してみることに

System.out.println("Hello World");}

しよう。基本的にはスタンドアローンと同}様の手順で作成するが、ホームページにア
プレットを貼り付けるためのHTMLファイ

スタンドアローンのプログラムはクラスのJava言語で書いた「Hello World」（アプレット）HelloWorldApplet.java
import java.awt.Graphics;
import java.applet.Applet;class HelloWorldApplet extends Applet {public void init(){}public void start() {これらはなくてもよい。
}
ここでは例としてあげて
public void stop() {いる。
}
public void destory(){}
public void paint(Graphics g) {g.drawString ("Hello World", 10, 10);}}ルも並行して作成する必要がある。

集合として書く。そしてクラス定義にあるプログラムの作成方法とコンパイル方法「mainメソッド（関数）」がインタープリタ

についてはスタンドアローンと変わりはなーから最初に呼び出される。

く、クラス名に「.java」拡張子を付けたファイルを作成しそれをコンパイルしてクラコンパイル

スファイルを作成する。アプレットのプロ◆◆◆◆◆◆

グラムは「 A p p l e t クラス（ 正 確 にはJavaソースコードを書いたら、つぎにコ

java.applet.Appletクラス）」のサブクラス

インターネットマガジン／株式会社インプレスR&D©1994-2007 Impress R&D

アプレットを埋め込んだHTMLファイルの例<HTML><HEAD><TITLE>Javaのサンプルプログラム</TITLE></HEAD><BODY><APPLET CODE="HelloWorldApplet.class"
WIDTH=100 HEIGHT=100></APPLET></BODY></HTML>

INTERNET magazine 1996/5

213HTMLファイルの作成

アプレットの実行

ネットスケープナビゲーターでの◆◆◆◆◆◆◆◆◆◆◆◆

アプレットの実行◆◆◆◆◆◆

アプレットをホームページに貼り付ける

アプレットを実 行 させるためには、

方法はイメージ（画像）ファイルをホーム

WWWブラウザーでアプレットを貼り付け

ネットスケープナビゲーターを使ってJava

ページに貼り付けるのと同様にHTMLファているHTMLファイルを呼び出す。現時点のアプレットを実行する場合には、「option」

イルで貼り付けたいアプレットのクラス名

ではネットスケープナビゲーター2.0とHot-

メニューの「Network and Security」内のを指定する。アプレットの貼り付けにはJavaブラウザーが対応している。ただしネ「disable java（Javaを無効にする）」が指「<APPLET」タグを使う。

ットスケープナビゲーターとHotJavaブラウ

定されていないことを確認する。また、β貼り付けには、拡張子「.class」を含んザーでは実行できるアプレットのバージョ版ではURLとして「http://...」のみが有効

だクラスファイル名を指定する。CODE-

ンが異なる。またJDKにはアプレットのテだった時期があった。そのためWWWサー

BASEが省略された場合には、HTMLファ

スト用に「appletviewer」が用意されておバーがない状態ではテストが困難だったが、イルと同じディレクトリにあるアプレットがり、これを利用するとアプレットだけのテ

現 在 ではU R L に「 f i l e : / / 」（ もしくは呼び出される。URLも指定できるが、セキストができる。

「FILE」メニューの「File Open」から）を

ュリティ上の理由から、アプレットをロー使用できるので、JDKとネットスケープナ

ドしたホスト以外のホストを指定しても実ビゲーターを入手するだけでJava言語を使行時に拒否される。

ったプログラムの開発ができるようになっ

なお、次のパート4以降ではHTMLファ

た。

イルを作成する必要があるが、この記事は言語仕様を中心とするため、省略している。

part 4
プログラム開発の実際
それでは実際にJavaプログラムのソースコ

プナビゲーター2.0、JDKに付属しているア

あらためて解説しない。他のオブジェクトードを見ながら、Javaプログラミングのエ

プレットビューアの両方での動作を確認し指向関係の資料を参考にして欲しい。

ッセンスをつぎの4つに分けて解説しよう。

てある。ただし、｢ネットワークアプリケー

1 文字と画像の表示
2 キーボード／マウスといったユーザーとの対話に必要なイベント処理

3 スレッドを利用した動きのあるアニメー

ション｣については「appletviewer」でのみ文字と画像の表示動作する。

◆◆◆◆◆◆

なお、ここでの解説はC++言語での開発

まずは、描画プログラムを例に基本的な経験のある方を対象としているので、メソ

アプレットプログラムの構成を見ていこう

ッド、クラス、継承などの用語については、（プログラム1）。アプレットは「Applet」

ション

4 クライアント・サーバー型のネットワー
クアプリケーション
このほかにJDKにはサンプルアプレットのソースコードが提供されているので参考になるだろう。
これらのプログラムはJDK 1.0を利用してウィンドウズ95の環境下で動作の確認をしてある。アプレットの実行はネットスケー

214 INTERNET magazine 1996/5

表2：Java言語の修飾子
クラス定義
publicパッケージとして別のクラスからもアクセスが可能なクラス（一般的）abstructabstructメソッドを含んでいるクラス定義

final

これ以上派生させることのできないクラス定義

変数およびメソッド
public

どのクラスからでも参照可能

protected

同じパッケージのクラスもしくは他のパッケージで定義されているサブクラスから参照可能

private protected

所属するクラスのサブクラスからのみ参照可能

private所属するクラス定義内でのみ参照可能

static

インスタンスには所属せず、クラスに1つだけ存在する。
staticメソッドからインスタンス変数は参照できない

インターネットマガジン／株式会社インプレスR&D©1994-2007 Impress R&D

クラスのサブクラスとして定義する。サブイドと呼ぶ）することでアプレットの開始

paint() アプレット内の表示領域全体を描

クラスの定義は定義するクラス名の後ろにと終了の処理を定義できる。ここでは、init

画するリフレッシュ処理をする。この処理「extends親クラス名」と記述する。

メソッドだけをオーバライドし、イメージフ

ではバックグラウンドを消してから書き直ァイルの読み込み処理をしている。

すので、上書きを行いたい場合には、下記class Draw extends Applet {アプレットで描画処理を行うための3つのupdateを利用する。アプレットが起動し// クラスの定義のメソッドが用意されている。repaintメソた際に呼び出されるので、存在しない変数}

ッドはオーバライドすることはできないが、などを参照しないように注意が必要だ。

paintメソッド、repaintメソッドは必要に

update() アプレットの表示領域に上書き応じて表示処理を記述する。

で表示を行う。

Appletクラスは自分で作成したものではrepaint() 画面表示を行うために他のメソなく、JDKで提供されているクラスを使う。
このように別に定義されているクラスを使用するために「importパッケージ名」文を

表3：Appletクラスの4つのメソッド使う。Javaでは複数のクラス定義をひとまinit()とめにしたものを「パッケージ」と呼ぶ。C

アプレットがブラウザーに読み込まれたときにだけ実行される。例のような描画に必要なイメージの読み込みなど、データ初期化などをすることが一般的だ。

start ()

アプレットが起動されたときに呼び出される。ブラウザー上でホームページ間を移動しアプレットのあるホームページに戻ってきたときにも呼び出される。

stop()

アプレットが停止されたときに呼び出される。ブラウザーで別のホームページに移動したときに呼び出される。アニメーションや音声などを再生している場合にはそれらを停止させるために利用することが多い。

destory()

アプレットが破棄されたときに呼び出される。メモリー解放はシステム側で行われるが、ネットワ
ーク接続の終了処理などが行われることが多い。

言語などでのライブラリと似ている。パッ
ケージは環境変数CLASSPATHで指定されるディレクトリから参照される。
それでは実際のクラス定義を見てみよう。
クラス定義の中は「変数（データ）」定義と「メソッド（関数）」定義に分けられる。
変数の定義はクラス定義内のどこでも行え、初期化が必要であれば「＝」で初期値を定義する。
配列はオブジェクトとして扱われるので、「new」演算子によって実際の領域を確保プログラム1 文字と画像の表示プログラム
import java.applet.Applet;// アプレットの作成に必要
import java.awt.*;// 描画処理に必要
public class Draw extends Applet {// クラス定義
Image
image;
Color colors[] = {Color.red, Color.blue, Color.green}; // 初期化された配列
int num̲colors = colors.length; // 配列の要素数の取得
String string = "Hello World!";
char chars[];
public void init () {// HTML 内の APPLETタグで指定されたイメージファイルを読み込む
image = getImage (getDocumentBase (), getParameter ("image"));する必要がある。配列の添え字は0から始
まり（要素数-1）までが有効で、範囲外に// Stringクラスの内容をキャラクタ配列に書き込む
chars = new char[string.length()];string.getChars(0, string.length(), chars, 0);

アクセスしようとすると、実行時エラーになる。
Color colors[3]; //この記述は許されない
Color colors[] = new Color[3]; //このように定義する
Color colors[] = {Color.red, Color.green, Color.bule};
期化をする}// 描画処理。毎回背景をクリアしてから表示が行われる。
public void paint (Graphics g) {int x, y;
FontMetrics
metrics = g.getFontMetrics();// 初// 1文字毎に色を変えて表示を行う。
x = 10; y = 30;
for (int i = 0; i < string.length(); i++) {g.setColor (colors[i % num̲colors]); // 色の指定
g.drawChars (chars, i, 1, x, y);// 文字表示x += (metrics.charWidth(chars[i]) + 1); // 文字幅を基に文字送り}

クラス定義や変数、メソッドには有効範
囲や定義の性格を決めるための修飾子がある。それぞれの定義文の先頭に修飾子を付// 四角を書く
g.drawRect (10, 50, 30, 30);
g.fillRect (60, 50, 30, 30);

加する。
アプレットの親となるAppletクラスには、// 円を書くg.drawArc (10, 120, 30, 30, 0, 360);g.fillArc (60, 120, 30, 30, 0, 360);

アプレットの動作が始まりと終わりに呼び出される4つの基本的なメソッドを持ってい// イメージを書く
g.drawImage (image, 10, 160, this);

る。これらのメソッドはデフォルトでは何の動作もしないので、派生したクラス内で同}}じ名前のメソッドを定義（これをオーバラ

インターネットマガジン／株式会社インプレスR&D©1994-2007 Impress R&D

INTERNET magazine 1996/5

215

プログラム2 マウスとキーボードからの入力を処理するプログラム

ッドから呼び出される。再表示を行うためにupdateメソッドを呼び出す。updateメソッドが定義されていない場合にはpaintメソ

import java.applet.Applet;
import java.awt.Event; // イベント処理用のパッケージ
import java.awt.*;
public class EventSample extends Applet {Color fgColor;
int
upperX, upperY, downX;
int
lowerX, lowerY, downY;

ッドを呼び出す。

static final int maxChars = 1024;
char inputChar[];int
numChars;

キーボード／マウスのイベント処理

boolean isText = false;// 定数と同様に使える

public void init () {inputChar = new char[maxChars];
upperX = upperY = lowerX = lowerY = 0;}◆◆◆◆◆◆
つぎのような条件を満たすアプリケーシ
ョンを作成してみる（プログラム2）。

public void start () {setBackground(Color.yellow);// 背景を設定}

1 マウス操作でブラウザーの画面上に4角// 表示処理。指定によって文字と四角をかき分ける
public void
paint (Graphics g) {g.setColor (fgColor);
if (isText) {// 文字の表示
g.drawChars (inputChar, 0, numChars, upperX,形を書く。マウスがクリックされたポイ
ントからドラッグし、ボタンが離された位置まで四角を表示する。ドラッグ中

upperY);
isText = false;} else {// 四角の表示
g.drawRect (upperX, upperY, lowerX - upperX,の表示の変化も表示する。

2 キーボードから入力された文字をブラウ
ザー上のマウスでクリックされた位置に表示する。
まず、ブラウザ上で表示をするので、「Applet」クラスから派生させる。イベントと呼ばれるマウスやキーボードからの入力を処理するためのパッケージが「java.awt.Event」として用意されているので、これをimportする。それ以外のグラフ
ィック関 連 のパッケージについては「java.awt.*」のようにパッケージ名にワイルドカードを使うことで、必要なパッケー
ジをコンパイラが判断して読み込むように指示する。
今回はstartメソッドを定義した。ここで、背景色をわかりやすくするために黄色に定義した。initメソッド内では、描画に必要な準備が整っていない場合があることと、別のホームページから戻ってきたときに背景を表示し直す必要があるので、ここで定義した。
一般的な入力イベントを取り扱うメソッドには以下のようなメソッドがある。

lowerY - upperY);}}// キーが話されたときの処理
public boolean keyUp (Event event, int key) {if (numChars == maxChars)
numChars = 0;
fgColor = Color.red;
inputChar[numChars++] = (char) key;isText = true;
repaint ();if ((char)key == '¥n') {numChars = 0;}
return true;}// マウスが押されたら初期座標を移動
public boolean mouseDown (Event event, int x, int y) {numChars = 0;
upperX = lowerX = downX = x;
upperY = lowerY = downY = y;return true;}// マウスが離されたら四角を決定
public boolean mouseUp (Event event, int x, int y) {fgColor = Color.black;
updatePosition (x, y);repaint ();return true;}// マウスがドラッグされている間は緑で表示
public boolean mouseDrag (Event event, int x, int y) {fgColor = Color.green;
updatePosition (x, y);repaint ();return true;}// このクラス定義でのみ参照できるメソッド// 座標位置を更新する
private void updatePosition (int x, int y) {if (x < downX) {upperX = x;lowerX = downX;} else {upperX = downX;
lowerX = x;}
if (y < downY) {upperY = y;lowerY = downY;} else {upperY = downY;
lowerY = y;}

マウスのボタンの数はプラットフォーム
によって異なることがある。マウス関係のイベントはどのボタンが操作されたかに関係なく呼び出される。そのためボタンを区

216 INTERNET magazine 1996/5// 文字型へ変換

インターネットマガジン／株式会社インプレスR&D©1994-2007 Impress R&D

別した処理をしたい場合は、メソッドに渡される引数のイベントオブジェクトを検査することで、どのボタンが操作されたかを判断する必要がある。今回は押されたボタンの種類に関わらずに処理をしている。
mouseDown、mouseUp、mouseDragの各メソッドをオーバライドしてマウス処理をしている。それぞれのメソッドにはマウスが操作された位置がアプレット領域の左上を（0，0）として渡されるので、マウスの操作に応じて四角を表示するために必要な座標の計算をするための内部だけで有効な（ p r i v a t e ） メソッドで定 義 されている

表4：入力イベントを処理するメソッド
mouseDown

マウスのボタンを押したとき

mouseUp

マウスのボタンを離したとき

mouseDrag

マウスをドラッグ（ボタンを押したままで移動）したとき

mouseEnter

マウスがアプレットの領域に入ったとき

mouseExit

マウスがアプレットの領域から出たとき

mouseMove

マウスを移動したとき

keyDown

キーを押したとき

keyUp

キーを離したときプログラム3 スレッドを処理するプログラム
import java.applet.*;import java.awt.*;// アプレットのサブクラスでスレッド処理を行うには「Runnable」インターフェースをつかう
public class Animation extends Applet implements Runnable {Imageimg[] = new Image[10];Threadtid = null;int
index = 0;// アニメーション用にイメージを読み込む。
public void init() {for (int i = 0; i < 10; i++)
img[i] = getImage(getDocumentBase(), "images/T" + i + ".gif");}

updatePositionメソッドを呼び出す。そしてrepaintメソッドを呼び出して表示処理をする。

// アプレットが起動されたらスレッドを作成し起動させる。
public void start() {if (tid == null) {tid = new Thread(this);
tid.start();}}キーボード入力はkeyUpメソッドを定義することで受け取れる。ここではpaintメソ
ッドで表示をするので、表示内容は常にク// アプレットが停止した起動しているスレッドも停止させる。
public void stop() {if (tid != null) {tid.stop();}tid = null;}

リアされてから表示されてしまう。そのため、これまでに入力した文字を覚えておくための配列を用意している。9行目で配列の宣言をしているが、その領域の最大値を// スレッドとなる処理。
// 200ms 休止し次のイメージを表示させる
public void run() {while (true) {if (index == 10)
index = 0;
repaint();try {tid.sleep(200);} catch (InterruptedException e) {}index++;}}

宣言するために12行目で「maxChars」という変 数 を定 義 している。 この変 数 は「static final int」と定義することで定数のように、変更できない変数として定義できる。
マウス処理とキーボード処理で表示処理のためのpaint処理を共有するので、文字表// スレッドで指定されたページのイメージを表示させる
public void paint(Graphics g) {g.drawImage(img[index], 10, 10, this);}

時か四角表示のどちらかを区別するための変数を設けている。それぞれのイベント処}理で表示をすることも（がんばれば）可能
だが、画面のリフレッシュ処理等を考えると表示の処理は集中させる方がよいだろう。

スレッドを利用した動きのあるアニメーション◆◆◆◆◆◆

表5：スレッド関連のメソッド
start

スレッドの開始。このメソッドが呼び出されることによりrunメソ
ッドで記述されたスレッドとしての処理が起動される

stop

スレッドの停止run

スレッドとして独立して動作する処理を記述

suspend

スレッド処理の一時停止

resume

停止しているスレッド処理の再開

sleep

スレッドの休眠（ミリ秒単位）

典型的なJavaアプレットというと「手を振っているDUKE」だろう。一般にアニメーションは、「パラパラまんが」のように、少しずつ違う絵をつぎつぎと表示して画像

インターネットマガジン／株式会社インプレスR&D©1994-2007 Impress R&D

INTERNET magazine 1996/5

217

が動いているように見せかける。もう1つのやり方は、演算によってグラフィックスを処理して画像を動かす方法である。
この処理をするためには必要な画像の作
成や表示という処理と一定時間経過するまで待つという2つの処理を同時にしなければプログラム4 サーバー側プログラム// ネットワークに必要なパッケージをロードする。
// アプレットではないので java.applet.* をロードする必要はない
import java.net.*;import java.io.*;// このプログラムはアプレットではなく「スタンド・アローン」で動作する。
// 入力を行うためのスレッドを定義
class serverIO extends Thread {DataInputStream
input;

ならない。画像を単純に繰り返し表示して// コンストラクタを定義
public serverIO(Socket so) {try {// 入力を受けるためのデータストリームを作成
input = new DataInputStream (so.getInputStream());} catch (IOException e) {}}いるだけでは、実際いつ画面上に表示結果が反映されるかわからないために、処理のタイミングに依存してしまうか、最悪の場合にはその処理から抜け出さないので、実// スレッドのメイン処理// クライアントからの入力を受け取り、1文字ごとに表示を行う。
public voidrun() {
try {while (true) {byte c = input.readByte();System.out.write((int)c);
System.out.flush(); // バッファをフラッシュ}} catch (IOException e) {}}際には画面上に何も表示されないかもしれない。
このような複数の処理をするためにJava
言語では「スレッド」という概念が用意されている。スレッドのためには「Thread」
クラスが提供されているが、今回はアニメーションを表示するためにアプレット上でスレッドを使わなければならない。ただしアプレットでスレッドを使うには注意が必要だ。
アプレットとして使うためには「Applet」}// 起動されるクラス。 mainメソッドが呼び出される。
public class serverSide {static public void main(String args[]) {serverIO tid;try {// 最初の引数をポート番号として受け口となるソケットを開く
ServerSocket ss = new ServerSocket(Integer.parseInt(args[0]));while (true) {System.out.println ("Waiting ...");
Socket so = ss.accept(); // クライアントからの接続を待つ。接続されるまで処理がブロックされる
System.out.println ("client request accepted !!");

クラスのサブクラスとして定義する必要が// 接続が確立されたらクライアントにメッセージを送信
PrintStream out = new PrintStream(so.getOutputStream());
out.println("Connection Established");out.println("¥tNice to meet you.");ある（プログラム3）。Java言語では複数の親を持つサブクラスは生成できない（多// 入力待ちのスレッドを作成/起動し、この処理は次のクライアントからの接続に備える。
tid = new serverIO (so);tid.start ();重継承ができない）。これを回避するために}} catch (IOException e) {}「Runable」インターフェイスが用意されているので、これを使ってクラス宣言をする。

}}

スレッドにはいくつかのメソッドが用意されている。これをオーバライドすることでクライアント・サーバー型のスレッドを操作する。

れているので、これを使うとUNIX での

この例で説明しているstartメソッドとネットワークアプリケーション

socketライブラリを利用したネットワーク

stopメソッドは、Appletクラス用のメソッ◆◆◆◆◆◆

アプリケーションと似たようなプログラムをドを定義している。アプレットが起動する

それでは最後にネットワークアプリケーと自分自身「Thread」を作成し、そのスションの例について見てみよう。Java言語

今回はすでに作成した四角を書くアプレ

レッドを開始させる。スレッドとして別のではクライアント・サーバー型のネットワ

ットに修正を加えたクライアントとサーバ動作になる処理をrunメソッドで定義してークアプリケーションを開発することがでーの間でメッセージの交換をするアプリケ

いる。このメソッドは一定期間（200ミリ

きる。言語としてはネットワークプロトコーションを作成する。サーバーとクライア秒）だけ休眠し、つぎの画像の表示の表示

ルには依存しない形で作成できるが、現在ント間で特定のポートを予め決めておいて処理を呼び出している。

のところTCP/IPでの通信のみがサポートさ

ネットワークを接続する。サーバーを起動れている。

するとクライアントからの接続を受けるた

このようにして表示処理と時間待ち処理
を別々に動作させることができる。

218 INTERNET magazine 1996/5

作成できる。

ネットワークアプリケーションを作成す

めのソケットが作成される。つぎにクライるためには「java.net」パッケージが用意さ

アントを起動し、サーバーとの接続が確立

インターネットマガジン／株式会社インプレスR&D©1994-2007 Impress R&D

されると、サーバーからメッセージが送られてくる。クライアント側でマウスボタンの操作によって四角が書かれるたびに、四角の座標がサーバーに伝えられる。

プログラム5 クライアント側プログラム
import java.io.*;import java.net.*;// ネットワーク用のパッケージをロード

public class clientThread extends Thread {// ネットワークスレッド用の内部変数を定義し、初期値も設定する。
Socket so = null;Thread tid = null;
DataInputStream input = null;PrintStream out = null;【サーバープログラム】
それでは、まずサーバー側のプログラム
から見てみよう（プログラム4）。今回の例の中でこのサーバーアプリケーションの// 指定されたホストのポートへ接続する。
public void open(String host, int port) {try {// まずは通信用のソケットを作成
so = new Socket(host, port);

みがアプレットクラスのサブクラスではな// 入出力用のデータストリームを作成
input = new DataInputStream(so.getInputStream());
out = new PrintStream (so.getOutputStream ());} catch (IOException e) {// socketの作成に失敗した場合のエラー処理}

い。デーモンと呼ばれるプログラムがUNIX
上のさまざまなネットワークサービスを提供しているが、Java言語で書かれたアプリケーションも単独で動作するデーモンとして記述ができることを示す意味も含めてスタンドアローンとして記述した。もちろんア
プレットとして記述することもできる。
通常、ネットワークアプリケーションは入出力処理とアプリケーションのメイン処
理を非同期にするので、マルチスレッド処理が必須だ。ネットワークからのデータ読
み込みは希望する長さ（バイト数）のデー
タが常に読み込めるとは限らないからだ。
データが到着するまで読み込み処理にだけ}// 終了時の処理。開いているソケットを閉じる
public void close() {try {if (so != null)
so.close();so = null;
input = null;out = null;} catch (IOException e) {}}// スレッドになる処理。
// サーバからのメッセージを受け取り改行毎に画面に表示。
public void run() {try {String msg = "";while (true) {if (input == null)continue;に専念するわけにいかない。UNIX では

char c = (char)input.readByte();msg = msg + c;
if (c == '¥n') {System.out.println(msg);
msg = "";}

s e l e c t システムコールを追 加 したり
read/writeなどの入出力処理をブロックしない（データが読み込めても読み込めなく}} catch (EOFException e) {} catch (IOException e) {}ても呼び出し側にすぐ戻る）ように修正していたが、Java言語ではスレッドがサポー}トされているので割と楽に作成することが// サーバとの接続が確立されていれば指定されたメッセージを送信
public boolean
sendMessage(String msg) {できる。受信と送信、さらにはメイン処理を別々のスレッドとして記述することで単【クライアントプログラム】

純化ができる。

呼び出されて使われることを想定している

この例ではサーバーはクライアントから

クライアント側は2つのファイルから構成ので、特にアプレットとして作成する必要の入力だけを監視しているので、送信用のされている。以前に作ったマウスで四角をはなかった｡そのため、「Thread」クラスか

スレッドは作成していない。クライアントか書くプログラムに処理を加えて、ネットワ

ら派生させた｡ネットワークの接続をするたらの接続が確立し、受信用スレッドを作成

ークオブジェクトを取り扱うようにしたもの

めのo p e n メソッドと、接続を終了する

するとサーバーはつぎのクライアントからのと（プログラム5）、実際にサーバーと通信

closeメソッド、さらにスレッドとなって処リクエストを受け取る処理をする。このよを行うためのネットワークオブジェクトを使理を行うためのrunメソッドが基本となって用したものだ（プログラム6）。

いる。今回はデータを送信だけをする必要

うにサーバープログラムを作成すると、複数のクライアントからの処理を同時にできる。

まずはネットワーク用のクラス定義からがあったので、メッセージを送信するため見てみよう。このクラスは他のクラスからのsendMessageメソッドを定義している

インターネットマガジン／株式会社インプレスR&D©1994-2007 Impress R&D

INTERNET magazine 1996/5

219

プログラム6 サーバーと通信するプログラム/*

イベントのテストで作成したマウスを使って四角を書くアプレットにネットワークアプレットを呼びだす。
*/
import java.applet.Applet;
import java.awt.Event;import java.awt.*;
public class EventSample extends Applet {Color fgColor;
int
upperX, upperY, downX;
int
lowerX, lowerY, downY;が、本来であればo p e n 、c l o s e 、r u n 、static final
int maxChars = 1024;
char inputChar[];int
numChars;

利用が可能になるように定義した方がよい

read、writeなどのメソッドで定義し、再だろう。今回はサンプルということでこの

boolean isText = false;
String serverHost = "";int
serverPort; // ポート番号// 接続先のホスト

clientThread sock = null;// ネットワーク用のスレッド

ようになっている。
ネットワークの接続を確立するために
Socketオブジェクトを作成している。このpublic void init () {inputChar = new char[maxChars];
upperX = upperY = lowerX = lowerY = 0;

オブジェクトの引数としてサーバー名とポ// このアプレットを呼び出したサーバに接続する。
// 現在はセキュリティ上の理由から接続できるホストに// 制限がある。
//
1. 自分自身//
2. アプレットを呼び出したサーバ//// ただし、appletviewerでは、テストの用にセキュリティを// はずすことができる。
serverHost = getDocumentBase().getHost();serverPort = Integer.parseInt(getParameter("port"));}ー番号を指定しているが、Java言語ではセキュリティ上の制限からアプリケーションから接続できるホストは、アプレットを読み込んだホストか、実行している自分自身// ネットワークスレッドを作成
sock = new clientThread();のホストに制限されている。

public void start () {// アプレットが起動されたらネットワークスレッドを開始させ
sock.start();// ネットワークの接続を行う。
sock.open(serverHost, serverPort);}

JDKでのアプレットテストプログラムであるappletviewerではセキュリティのレベ
ルを「None（不可）」、「applet Host（アsetBackground(Color.yellow);

プレットを読み込んだホスト）」「Unre-public void stop() {// アプレットが停止したらネットワークを閉じてsock.close();// ネットワークスレッドも停止させる。
sock.stop();}stricted（制限なし）」の3段階から選択することができる。

public void paint (Graphics g) {g.setColor (fgColor);
if (isText) {g.drawChars (inputChar, 0, numChars, upperX, upperY);
isText = false;} else {g.drawRect (upperX, upperY, lowerX - upperX, lowerY - upperY);}}
public boolean
keyUp (Event event, int key) {if (numChars == maxChars)
numChars = 0;
fgColor = Color.red;
inputChar[numChars++] = (char) key;isText = true;
repaint ();if ((char)key == '¥n') {numChars = 0;}
return true;}のエラーやイベント、割り込みといった例
外処理が発生することが予想される。そのため、これらの例外に対しての処理を記述する必要がある。

＊ここで紹介したサンプルプログラムはイン
ターネットマガジンのWWWサーバーからダ

public boolean
mouseDown (Event event, int x, int y) {numChars = 0;
upperX = lowerX = downX = x;
upperY = lowerY = downY = y;return true;}

ウンロードできます。
j http://home.impress.co.jp/maga

public boolean
mouseUp (Event event, int x, int y) {fgColor = Color.black;
updatePosition (x, y);repaint ();}ネットワークのアプリケーションでは各種

zine/inetmag/magnavi/ip9605/// 画面上に表示した四角の座標をサーバに送信する。
sock.sendMessage("Rectangle(" + upperX + ", " + upperY + ") - (" + lowerX + ", " + lowerY + ")");
return true;

public boolean
mouseDrag (Event event, int x, int y) {fgColor = Color.green;
updatePosition (x, y);repaint ();return true;}
private void updatePosition (int x, int y) {if (x < downX) {upperX = x;lowerX = downX;} else {upperX = downX;
lowerX = x;}
if (y < downY) {upperY = y;lowerY = downY;} else {upperY = downY;
lowerY = y;}}}

220 INTERNET magazine 1996/5

インターネットマガジン／株式会社インプレスR&D©1994-2007 Impress R&D［インターネットマガジン バックナンバーアーカイブ］ ご利用上の注意
この PDF ファイルは、株式会社インプレス R&D（株式会社インプレスから分割）が 1994 年～2006 年まで発行した月刊誌『インターネットマガジン』の誌面を PDF 化し、「インターネットマガジン バックナンバー
アーカイブ」として以下のウェブサイト「All-in-One INTERNET magazine 2.0」で公開しているものです。

http://i.impressRD.jp/bn
このファイルをご利用いただくにあたり、下記の注意事項を必ずお読みください。
z 記載されている内容（技術解説、URL、団体・企業名、商品名、価格、プレゼント募集、アンケートなど）は発行当時のものです。
z 収録されている内容は著作権法上の保護を受けています。著作権はそれぞれの記事の著作者（執筆者、写真の撮影者、イラストの作成者、編集部など）が保持しています。
z 著作者から許諾が得られなかった著作物は収録されていない場合があります。
z このファイルやその内容を改変したり、商用を目的として再利用することはできません。あくまで個人や企業の非商用利用での閲覧、複製、送信に限られます。
z 収録されている内容を何らかの媒体に引用としてご利用する際は、出典として媒体名および月号、該当ページ
番号、発行元（株式会社インプレス R&D）、コピーライトなどの情報をご明記ください。
z オリジナルの雑誌の発行時点では、株式会社インプレス R&D（当時は株式会社インプレス）と著作権者は内容が正確なものであるように最大限に努めましたが、すべての情報が完全に正確であることは保証できません。このファイルの内容に起因する直接的および間接的な損害に対して、一切の責任を負いません。お客様個人の責任においてご利用ください。

このファイルに関するお問い合わせ先
All-in-One INTERNET magazine 編集部
im-info@impress.co.jp
Copyright © 1994-2007 Impress R&D, an Impress Group company. All rights reserved.