目次

Server05とClient05の問題点

通信の様子

このクライアントはまだまだ欠陥がありますが、動きます。どこに問題があるかわかるでしょうか。

Client05 です。起動して、vine40に「こんにちは」のメッセージを送ります。

Client05 です。まだ返事がきません。ボタンがおしたままになっています。「こんにちは」の部分が 「waiting..」になるようにプログラムしたはずが、そうなっていません。これはプログラムの仕方に問題があるのです。

Client05 です。右側が消えているのは、その部分が別のウインドウの下になったからです。もう一度上になった時に書き直されるはずですがそれがなされていないということです。上記のwaitingもおなじく、これはプログラムの仕方に問題があるのです。

Server05 です。メッセージが来ました。

Server05 です。返信を書いて送ります。

Client05 です。返信が来るとそれをTextFieldに書き込んでactionPerformedの部分が終わります。actionPerformedの部分から抜けて初めてこのフレームが再描画されるのです。

問題点

実はjavaの書き方として勧められないことをしています。

ただ、javaは書いてはいけないようには書かせない方式。つまりコンパイル時にエラーを出させるような作りをしていますから、書けるけどやっちゃだめというのはおかしな話です。しかし、上に見るように一度隠されたウィンドウが再描画されないというのは「困る」ことですから、javaの仕組みを知ってそうならないようにプログラムすべきでしょう。

actionPerformedの内部で返信を待っていることが問題です。actionPerformedの実行中にマウスをクリックするとどうなるでしょうか。それはシステムの作り方にもよりますが、保留されています。クリックされたことを覚えていて、現在実行中のactionPerformedが終わり次第また、actionPerformedを実行します。そのときにはtextFieldには返信された文字列が入っていますから、それを同じ人に送り返すことになりますね。

これもプログラムの動きとしてはまずいですね。

通信もactionPerformedと同様に一つの通信が行われている間に別の通信が待たされるということも起こります。これをどう処理するかをちゃんと考えなければなりません。

プログラムの世界では、これはスレッドというものを用いて解決します。WindowsではたくさんのWindowを開けますが、ブラウザがデータを取り寄せている間に文章をつくったり、音楽を再生しながら絵を描いたりできます。つまり多数の処理が同時に行われます。

現在の所Windowsの力を使ってサーバーが一つのスレッド、クライアントが1つのスレッドですが、一つのプログラム内でスレッドをたくさん使えれば返信を待ちながら別の人にメッセージを書くことが簡単にできます。

もくじ

聖愛高等学校
http://www.seiai.ed.jp/
Last Modified