前ページの作品を送信と受信プログラムを、繰り返しにした例です。
送信相手が使っているマシンの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();
}
}