6. 簡単なnetworkプログラミング

Java アプレットからネットワークを利用する場合は、セキュリティ保護の点から多くの制約があります。そのひとつは、アプレットをロードしたホストに対してのみネットワーク接続が可能であり、ローカルのホスト(ブラウザを起動しているパソコンなど)に対しては一切のアクセスが不可能です。アプレット間の通信も同一ページ上にあるアプレット間でのみ可能です。
 これに対してアプリケーションの場合は他のプログラミング言語(C, C++)と同様に 何でもできます。利用したい機能が標準のクラスとして用意してありますので、開発も 簡単に短期間にできます。
WWWあるいはLANはハードウェアとしてはEthernetを用い、ソフト的にはTCP/IPを用いています。ネットワークに接続し、そのデータを授受するときにIPアドレスだけではどのプロセスが処理するかが分からないので、その区別をするためにポート番号と呼ばれるものを利用します。サーバ側にはあらかじめ決められた番号が割り当てられており、クライアント側では内部的に重複しない番号をOSから得てそれを短命ポート番号として用います。

以下はサーバ側で用いられているポート番号の代表的なものです。

プロトコル名ポート番号/プロトコル
echo7/udp
ftp-data20/tcp,udp
ftp21/tcp,udp
telnet23/tcp,udp
smtp25/tcp,udp
time37/tcp,udp
nameserver42/tcp,udp
nicname43/tcp,udp
domain53/tcp,udp
tftp69/tcp,udp
gopher70/tcp,udp
finger79/tcp,udp
http80/tcp,udp
pop3110/tcp,udp
sqlserv118/tcp,udp
nntp119/tcp,udp
ntp123/tcp,udp
netbios-ns137/tcp,udp
netbios-dgm138/tcp,udp
snmp161/tcp,udp
irc194/tcp,udp
exec512/tcp
biff512/udp
who513/udp
timed525/tcp,udp

ここでは、この表の一番上にあるecho portを用いたサーバ/クライアント間通信を実験してみます。まず このソースを見てください。

mainメソッドではソケットを作り、そのソケットにクライアントが接続するまで待ち、接続されたら実際に動作するEchoServerを新しいスレッドで動作させます。

EchoServerクラスでは、まず、そのソケットがどこから接続されたかの情報を表示します。たとえば、
「新しいスレッドの開始 socket:Socket[addr=/192.168.82.123,port=1881,localport=7]」
と表示します。addrはIPアドレス、portは上で説明した短命ポート番号、localportは使用しているサーバー側のechoport番号です。
次に入出力ストリームを作り、そのストリームからの入力データがなくなるまで入力したデータをそのまま出力ストリームに出力します。そして接続を閉じるという単純なサーバーです。

次にクライアント側のソースを見てください。
このプログラムは'A'という文字を128個localhostという名前のhostに送ります。
localhostというのは特殊なhost名で、ループバックテスト用に用いられます。この場合はサーバーもクライアントも同じマシン上にあることになります。これは当然自分自身のhost名、IPアドレスでも可能です。マシンを変えたときにソースも変える必要が無いので用います。まず、同じマシン上でテストしてから他のマシンと通信実験を行います。
らコンストラクタにてこれから行うことを表示し、ソケットをサーバーのechoportに接続し入出力ストリームを作ります。設定した個数(128)サーバーに送り、サーバーから送り返されたデータを入力し、標準出力に出力します。最後に接続を切ります。

実行方法
 サーバー側を先に起動させてから、クライアント側を起動させます。

問題6-1

サーバー、クライアント側のプログラムを作り、サーバーをTINI、 クライアントをパソコン側で動かしその動作の確認をしなさい。
 このプログラムではクライアント側から'A'を送っているのに'A'が表示されないのは何故か? ソースプログラムを修正して正しく表示するようにしなさい。

問題6-2

提示しているソースプログラムではサーバー側の表示が文字化けします。これはTINIの中のJavaVMが日本語対応になっていないためですが、対策はあります。

        System.out.println("EchoServer 開始...");
の部分は
        System.out.println("EchoServer \u008A\u004A\u008E\u006E...");
とすれば表示できます。この謎を解いて他の場所も文字化けの無いように修正しなさい。

問題6-3

文字列を送ったらその文字列が返ってくるように修正しなさい。

問題6-4

サーバーに接続したらサーバーからその時の日付、時間などの情報をクライアントに送り返すtimeserverに改造しなさい。

問題6-5

温度と時刻を対にした文字列を送り返すように修正しなさい。


TOPページへ戻る