前ページの作品を送信と受信プログラムを、繰り返しにした例です。
送信相手が使っているマシンの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();//ソケットを閉じる } }
空のパケット受信で、繰り返し終了させます。
受信側では、受信したデータグラムパケットより、相手が使っている送信元ポート番号が
記憶されるので、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(); } }