next up previous contents
Next: ClassLoader Up: Network Previous: Server

Datagram

今までみてきた Server Client model では、サーバとクライアントとの間に、基本的に は、コネクションを張ることを想定していましたが、ネットワークでは、コネクション 以外にもデータのやり取りが可能です。それが、これからみる、「データグラム」 です。

コネクション型の通信では、いったん通信路が確立されると、行き来するデータ自体 には、通信相手についてのアドレスの情報は含まれません。例えば、電話は、典型的な コネクション型の通信ですが、相手のアドレス情報が必要なのは、ダイヤルを回す時 だけで、いったん相手の電話とつながれば、どちらの話手がたとえ別の人に変わって も、電話が切れるまでは、自由に会話が出来ます。 一方、電子メールや葉書での通信を考えてみれば、宛先が無いものは相手に届き ません。データは必ず相手のアドレスと一緒に送られることになります。 データグラムは、こうしたタイプの通信です。

Java では、データグラム型の通信に、DatagramSocketとDatagramPacketという 二つのクラスを利用します。おおまかに言うと、DatagramSocket クラスは、データの 送りだし口/受け取り口を作ります。データの送り手のアドレスは、このクラスの インスタンスが持つことになります。DatagramPacket クラスは、ネットワークを行き来 するパケットを作ります。パケットには、データの受け手のアドレス情報を埋め込む 必要があります。パケットの送り手/受け手で、プログラムのスタイルが、多少、 異なります。次に、その違いを見てみましょう。

パケットを送る

 DatagramSocket socket = new DatagramSocket(); 
 byte buf[] = new byte[256];
 String text = new String("Hellow World!!");
 text.getBytes(0, text.length(), buf , 0 );
 InetAddress address   = InetAddress.getByName("www.wakhok.ac.jp");
 int port = 8080 ;
 DatagramPacket packet = new DatagramPacket( buf, buf.length, address, port);
 socket.send(packet);

このプログラムでは、"Hellow World!!"というメッセージが、"www.wakhok.ac.jp" というマシンの、ポート8080番に送られます。

文字列は、String クラスのメソッド getBytes() で、いったんbyte[]型に 変換される必要があることに注意して下さい。

パケットを受け取る

 DatagramSocket socket = new DatagramSocket( 8080 ); 
 byte buf[] = new byte[256];
 DatagramPacket packet = new DatagramPacket( buf, 256 );
 socket.receive(packet);
 String text = new String( packet.getData(), 0 );
 InetAddress address = packet.getAddress();
 int port = packet.getPort();

このプログラムは、自分のホストのポート8080番に送られてくるパケットを 監視します。socket.receive(packet); は、パケットがくるまで ブロックします。

パケットの情報には、データだけでなく、送り手のアドレスや、そのポート番号 も含まれています。



maruyama@wakhok.ac.jp