今までみてきた 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);
は、パケットがくるまで
ブロックします。
パケットの情報には、データだけでなく、送り手のアドレスや、そのポート番号 も含まれています。