UDPトプログラム2 Java編

前ページの作品を送信と受信プログラムを、繰り返しにした例です。

UDP送信プログラム

送信相手が使っているマシンのIPアドレスを入力してから始まる変更です。
メッセージを送信する繰り返しで、Enterだけの入力で、空のデータグラムを送信後に繰り返し終了させています。
UDPデータ構造より分かるように、データグラムパケットの中に、送信先ポート番号と、送信元ポート番号の2つ情報があります。
送信先ポート番号は49152ですが、送信元ポート番号は、送信に使うデータグラムのソケットより取得できます。 それはgetLocalPortメソッドより分かります。

01
02
03
04
05
06
07
08
09
10 11
12
13
14
15
16
17
18
19
20 21
22
23
24
25
26
27
28
29
import java.io.*;//BufferedReadered用
import java.net.*;//DatagramSocket、InetAddress用
public class UDPSndTest {
	public static void main(String[] args) throws Exception {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		System.out.print("送信先IPアドレス>");
		InetAddress inet = InetAddress.getByName(  br.readLine()  );
		int portNumber = 49152;//ポート番号
		DatagramSocket sendSocket = new DatagramSocket();//UDP送信用ソケット
		for(;;){
			System.out.print("送信文字列>");
			String msg = br.readLine();//送信メッセージキー入力
			if(msg.equals("")) {
				sendSocket.send(new DatagramPacket(new byte[0], 0, inet, portNumber));//送信
				break;
			}

			msg = "ここはsから始まる学籍番号に変更" + msg;
			byte[] buf = msg.getBytes("MS932");//バイト列に変換
			DatagramPacket packet;
			packet = new DatagramPacket(buf, buf.length, inet, portNumber);
			//IPアドレス、ポート番号も指定
			sendSocket.send(packet);//送信
			System.out.println(sendSocket.getLocalPort() + "のポートを使って送信します。");
		}
		sendSocket.close();//ソケットを閉じる
	}
}


UDPRecTest.java の変更

空のパケット受信で、繰り返し終了させます。
受信側では、受信したデータグラムパケットより、相手が使っている送信元ポート番号が 記憶されるので、getPortメソッド分かります。
また、このパケットから送信相手のIPアドレスが、getAddressメソッドで分かります。

01
02
03
04
05
06
07
08
09
10 11
12
13
14
15
16
17
18
19
20 21
22
23
24
import java.io.*;//BufferedReadered用
import java.net.*;//DatagramSocket用

public class UDPRecTest
{
	public static void main(String[] args) throws Exception
	{
		byte[] buf = new byte[256];
		int portNumber = 49152;//ポート番号
		DatagramPacket packet = new DatagramPacket(buf, buf.length);
		DatagramSocket recSocket = new DatagramSocket(portNumber);//UDP受信用ソケット
		for(;;){	
			System.out.println("受信待機状態");
			recSocket.receive(packet);//受信& wait
			int len = packet.getLength();//受信バイト数取得
			if(len == 0) break;
			String msg = new String(buf, 0, len, "MS932");
			System.out.println(msg + ":以上" + len + "byte を受信しました。");
			System.out.println("パケット送信元のポート番号は" + packet.getPort() + "です。");
			System.out.println("パケット送信元のIPアドレスは" + packet.getAddress() + "です。");
		}
		recSocket.close();
	}
}