25. DatagramSocket |
UDP を使った通信プログラムについて説明します。
(1) UDP を使った通信プログラム |
Java ではネットワークを介した通信プログラムをもう1つ紹介しておきましょう。前回は TCP を使った通信法を紹介しましたが、今回はUDPを使った通信です。今回も java.net パッケージのクラスを使います。
UDP は手紙のような通信方法です。前回の TCP とは違い、相手に接続したことを確認することなくデータを送ります。ポストに手紙を入れたらあとは勝手に相手に届きますよね。
UDP を使った通信では相手に接続してから通信をはじめるわけではないので、サーバとクライアントという明確な分け方はできません。ですが、説明の都合上はじめに起動されているプログラムの方をサーバと呼ぶことにします。
今回の UDP を使った通信でも相手を特定するのにホスト名(IPアドレス)とポート番号を知っている必要があります。
(2) データを送信する場合 |
DatagramSocket(int port) throws SocketException
データを送信する場合は、DatagramPacket というデータを入れる箱を用意します。この中に送信するデータ、データの長さ、相手のIPアドレス、ポート番号を入れます。送信するデータはバイト列にしなければならないので注意してください。
DatagramPacket(byte[ ] buf, int length, InetAddress address, int port)
これで準備はできました。あとは送信するだけです。送信する場合は、DatagramSocket クラスの send( ) を使い作成した DatagramPacket を送信します。
send(DatagramPacket packet)
InetAddress クラスはこの章の後半で紹介するよ。
(3) データを受信する場合 |
DatagramSocket(int port) throws SocketException
データを受信する場合は、受信用の DatagramPacket を用意します。この中に受信するデータ、データの長さを入れます。
DatagramPacket(byte[ ] buf, int length)
この DatagramPacket にデータを受信するには DatagramSocket クラスの recieve( ) を使います。
recieve(DatagramPacket packet)
(4) IP アドレスを管理するクラス 〜InetAddress〜 |
static InetAddress getByName(String hostName)
(5) プログラムの例 |
import java.net.*; import java.io.*; class UDPServer { public static void main(String args[]) { System.out.println("Ready!"); try { DatagramSocket ss = new DatagramSocket(5000); byte recvData[] = new byte[1024]; // 受信するデータ DatagramPacket packet = new DatagramPacket(recvData, recvData.length); // データを受信する(受信するまで待つ) ss.receive(packet); // DatagramPacketからデータを取りだし文字列を再構築 String recvStr = new String( packet.getData() ); System.out.println("受信したデータ : "+recvStr); } catch (Exception e) { System.out.println("Server : IOError"); e.printStackTrace(); } } } |
import java.net.*; import java.io.*; class UDPClient { public static void main(String args[]) { if ( args.length!=2 ) { System.out.println("使い方:java UDPClient <hostName> <sendData>"); System.exit(0); } try { DatagramSocket ss = new DatagramSocket(6000); String sendData = args[1]; // 送信データ int port = 5000; // 送信先ポート // 送信先アドレス InetAddress sendAddr = InetAddress.getByName(args[0]); DatagramPacket packet = new DatagramPacket( sendData.getBytes(), sendData.getBytes().length, sendAddr, port); ss.send(packet); } catch (Exception e) { System.out.println("Server : IOError"); e.printStackTrace(); } } } |
C:\java_test>java UDPServer Ready! |
C:\java_test>java UDPClient 127.0.0.1 データ送信のテスト |
C:\java_test>java UDPServer Ready! 受信したデータ : データ送信のテスト |