Javaプログラミング--ネットワークプログラミング(UDP)


Javaプログラミング--ネットワークプログラミング(UDP)
 一.UDPプロトコル送信データ:
 (1)送信先socketオブジェクトの作成
 (2)データを作成し、データを包装する
 (3)socketオブジェクトの送信方法を呼び出してパケットを送信する
 (4)資源の放出
UDP送信側に関する方法:
java.net類Datagram Socketjava.lang.Object  java.net.DatagramSocketのような表現は、データパケットを送信および受信するためのソケットです。
java.net類Datagram Packetjava.lang.Object  java.net.DatagramPacketなどはデータパケットを表します。
public void send(Datagram Packet) p):このソケットからパケットを送信します。Datagram Packet 含まれる情報は、送信するデータ、その長さ、リモートホストのIPアドレス、およびリモートホストのポート番号を示しています。
public DatagramPacket(byte[] buf,int length,InetAddress address、int port)パケットを作成し、長さをlengthとする。 指定されたホスト上の指定ポート番号にパケットを送信します。length パラメータがbuf.length以下でなければなりません。パラメータ: buf - データを包むlength - 長さを包むaddress - 宛先ポーター - 目的ポート番号
【ケース】UDP送信端を作成します。
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;

/*
 * 	UDP      :
 * 	(1)     socket  
 * 	(2)          
 * 	(3)  socket            
 * 	(4)    
 * */
public class SendDemo {
	public static void main(String[] args) throws IOException {
	    //(1)     socket  
		// DatagramSocket():                          。
		DatagramSocket ds = new DatagramSocket();
		
		//(2)          
		// public DatagramPacket(byte[] buf,int length,InetAddress address,int port)
		// 1-    
		byte[] bys = "hello UDP,   ".getBytes();
		// 2-  
		int len = bys.length;
		// 3-IP  
		InetAddress address = InetAddress.getByName("192.168.80.1");
		// 4-  
		int port = 10086;
		DatagramPacket dp = new DatagramPacket(bys,len,address,port);
		
		//(3)  socket            
		ds.send(dp);
		
		//(4)    
		ds.close();
	}
}
 二.UDPプロトコル受信データ:
(1)送信先socketオブジェクトの作成(ポート指定が必要)
(2)パケットを作成する(受信容器) 
(3)socketオブジェクトの受信方法を呼び出してデータを受信する
(4)データを解析し、コンソールに表示する
(5)資源の放出
UDP受信側に関する方法:
public DatagramSocket(int) port):データグラムソケットを作成し、ローカルホスト上の指定ポートにバインドする。
Datagram Packet(byte[] buf,int length):Datagram Packetを作成し、受信長はlengthである。 のパケットです
public void receive(DatagramPacket) p):このソケットからデータパケットを受信します。
public byte[]getData():データバッファに戻ります。
public int getLength():送信または受信するデータの長さを返します。
public InetAddress get Addres():あるマシンのIPアドレスを返します。このデータはこのマシンに送信されます。あるいはこのマシンから受信されます。 
【ケース】UDP受信側を作成します。
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;

/*
 *  UDP      :
	(1)     socket  
	(2)       (    ) 
	(3)  socket           
	(4)           
	(5)    
*/
public class ReceiveDemo {

	public static void main(String[] args) throws IOException {
		// (1)     socket  
		// public DatagramSocket(int port):                        。
		DatagramSocket ds = new DatagramSocket(10086);

		// (2)       (    )
		// DatagramPacket(byte[] buf, int length):  DatagramPacket,       
		// length     。
		byte[] bys = new byte[1024];
		int len = bys.length;

		DatagramPacket dp = new DatagramPacket(bys, len);

		// (3)  socket           
		// public void receive(DatagramPacket p):           。
		ds.receive(dp);

		// (4)           
		//      IP
		// public InetAddress getAddress():        IP  ,                      。
		InetAddress address = dp.getAddress();
		String ip = address.getHostAddress();

		// public byte[] getData():       。
		// public int getLength():                。
		byte[] bys2 = dp.getData();
		int len2 = dp.getLength();
		String s = new String(bys2, 0, len2);
		System.out.println(ip + ":" + s);

		// (5)    
		ds.close();
	}
}
コードの最適化:
【受信側】
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;

public class ReceiveDemo {
	public static void main(String[] args) throws IOException {
		//       socket  
		DatagramSocket ds = new DatagramSocket(12345);

		//       
		byte[] bys = new byte[1024];
		DatagramPacket dp = new DatagramPacket(bys, bys.length);

		//     
		ds.receive(dp);

		//     
		String ip = dp.getAddress().getHostAddress();
		String s = new String(dp.getData(), 0, dp.getLength());
		System.out.println("form " + ip + ":" + s);

		//     
		ds.close();
	}
}
【送信側】
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;

public class SendDemo {
	public static void main(String[] args) throws IOException{
		//     socket  
		DatagramSocket ds = new DatagramSocket();
		//        
		byte[] bys = "hello world".getBytes();
		DatagramPacket dp = new DatagramPacket(bys, bys.length, 
				InetAddress.getByName("192.168.80.1"), 12345);
		//     
		ds.send(dp);
		
		//     
		ds.close();
	}
}
【ケース】データはキーボードから入力され、ユーザーが入力した「886」が終了します。
受信側:
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;

public class ReceiveDemo {
	public static void main(String[] args) throws IOException {
		//       socket  
		DatagramSocket ds = new DatagramSocket(12345);

		while (true) {
			//       
			byte[] bys = new byte[1024];
			DatagramPacket dp = new DatagramPacket(bys, bys.length);

			//     
			ds.receive(dp);

			//     
			String ip = dp.getAddress().getHostAddress();
			String s = new String(dp.getData(), 0, dp.getLength());
			System.out.println("form " + ip + ":" + s);
		}
		//              ,     
		//     
		// ds.close();

	}
}
送信先:
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;

public class SendDemo {
	public static void main(String[] args) throws IOException {
		//     socket  
		DatagramSocket ds = new DatagramSocket();
		//        
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		String line = null;
		while ((line = br.readLine()) != null) {
			if ("886".equals(line)) {
				break;
			}
			byte[] bys = line.getBytes();
			DatagramPacket dp = new DatagramPacket(bys, bys.length, InetAddress.getByName("192.168.80.1"), 12345);
			//     
			ds.send(dp);
		}

		//     
		ds.close();
	}
}