UDP は TCPとは異なり、接続(Connection)を確立しなくても使用することができます。 UDPのデータ (データグラム, datagram と呼ばれる)は、個別のアドレス情報を保持しており、互いに独立している。 UDPソケットを作成すれば、どのようなアドレスのホストからでも、複数のホストとの間で次々にデータグラムを受信できます。 受信データグラムには送信元のIPアドレスやポート番号が含まれており、送られてきたデータの単位で取り出すことができ、TCPのようにデータがつながってしまうことはありません。つまり、UDPはメッセージの境界を保持します。
TCPとは異なり、UDPではデータグラムが届くかどうかは保証されず、また、データの届く順番も保証されません。
UDPでは、接続を確立せずに使えるので、TCPと比べると効率がよいといえます。 わずかな量のデータしかやりとりしない場合は、TCPの接続確立のためのメッセージのやりとりは無視できません。 また、信頼性の高いのストリーム通信を必要としない場面では、オーバーヘッドを非常に小さくできます。
また、コネクションを確立せずに通信を行えますので、ブロードキャスト・アドレス宛にデータを送ることもできます。
パケットの長さは、直前に処理したデータグラムの長さに応じて設定されるため、 元のバッファサイズよりも小さくなることがあります。 そのため、パケットを再利用する場合はバッファサイズをリセットする必要があることに注意が必要です。
UDPSendClient.javaの実行例 |
$ javac UDPSendClient.java |
津田塾大学計算センターs205wsの教室のネットワークのネットワーク・アドレスは 172.17.0.0/23 なので、 ブロードキャスト・アドレスは 172.17.1.255 となります(2019年4月8日時点)。
UDPRecvServer.javaの実行例 |
$ javac UDPRecvServer.java |
[注意] UDPサーバが文字列を受け取るためには、UDPクライアントに文字列を入力する時点でUDPサーバが起動している必要があります。
UDPEchoClient.javaの実行例 |
$ javac UDPEchoClient.java |
UDPEchoServer.java の変更点 |
*** udp/UDPRecvServer.java Sat Apr 6 15:04:19 2019 --- udp/UDPEchoServer.java Sat Apr 6 15:04:40 2019 *************** *** 2,12 **** import java.io.*; import java.util.*; ! public class UDPRecvServer { UDPServer serv; int maxlen; ! public UDPRecvServer(int port, int maxlen) { serv = new UDPServer(port); this.maxlen = maxlen; } --- 2,12 ---- import java.io.*; import java.util.*; ! public class UDPEchoServer { UDPServer serv; int maxlen; ! public UDPEchoServer(int port, int maxlen) { serv = new UDPServer(port); this.maxlen = maxlen; } *************** *** 22,27 **** --- 22,28 ---- byte[] data = Arrays.copyOfRange(pkt.getData(), pkt.getOffset(), pkt.getLength()); String s = new String(data); System.out.println(pkt.getAddress()+":"+pkt.getPort()+" "+s); + serv.send(pkt); if (s.equals("end")) break; pkt.setLength(maxlen); // resize data buffer } catch (IOException e) { *************** *** 41,47 **** System.err.println("unknown option: "+args[i]); } } ! UDPRecvServer prog = new UDPRecvServer(p, mlen); prog.run(); } } --- 42,48 ---- System.err.println("unknown option: "+args[i]); } } ! UDPEchoServer prog = new UDPEchoServer(p, mlen); prog.run(); } } |
UDPEchoServer.javaの実行例 |
$ javac UDPEchoServer.java |