Javaネットワークプログラミング2.UDPネットワークプログラミング


UDPネットワークプログラミング——DatagramSocketクラス
 
1、UDPプロトコル送信データ——クライアント
(1)UDPプロトコルがデータを送信するステップ:
  • UDPプロトコル送信データ
  • A:送信側Socketオブジェクト
  • を作成する
  • B:データを作成し、
  • にパッケージ化
  • C:Socketオブジェクトの送信方法を呼び出すパケット
  • を送信する.
  • D:リソースの解放

  • (2)UDPプロトコルによるデータ送信方法
  • DatagramSocket():送信側Socketオブジェクト
  • を作成する.
  • DatagramPacket(byte[]buf,int length,InetAddress address,int port):データを作成し、データをパッケージ化(送信パケット)
  • DatagramPacket dp = new DatagramPacket(bys, length, address, port);

  • public void send(DatagramPacket p):Socketオブジェクトの送信方法を呼び出してパケット
  • を送信する.
  • ds.close():リソースを解放する
  • (3)UDPプロトコル送信データの例
    package cn.itcast_02;
    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()
    		DatagramSocket ds = new DatagramSocket();
    		//     ,      
    		// DatagramPacket(byte[] buf, int length, InetAddress address, int port)
    		//     
    		byte[] bys = "hello,udp,   ".getBytes();
    		//   
    		int length = bys.length;
    		// IP    
    		InetAddress address = InetAddress.getByName("192.168.12.92");
    		//   
    		int port = 10086;
    		DatagramPacket dp = new DatagramPacket(bys, length, address, port);
    		//   Socket            
    		// public void send(DatagramPacket p)
    		ds.send(dp);
    		//     
    		ds.close();
    	}
    }
    

     
    2、UDPプロトコル受信データ——サーバー側
    (1)UDPプロトコル受信データステップ
  • UDPプロトコル受信データ
  • A:受信側Socketオブジェクト
  • を作成する
  • B:パケット(受信コンテナ)
  • を作成する
  • C:Socketオブジェクトを呼び出す受信方法受信データ
  • D:パケットを解析し、コンソール
  • に表示する.
  • E:リソースの解放

  • (2)UDPプロトコル受信データ方法
  • DatagramSocket(int port):受信側Socketオブジェクトを作成する
  • DatagramPacket(byte[]buf,int length):パケット(受信コンテナ)を作成する
  • public void receive(DatagramPacket p):Socketオブジェクトを呼び出す受信メソッド受信データ(ブロックメソッド)
  • .
  • public InetAddress getAddress():相手のip
  • を取得する
  • public byte[]getData():取得データバッファ
  • public int getLength():取得データの実際の長さ
  • ds.close():リソースを解放する
  • (3)UDPプロトコル受信データ例
    package cn.itcast_02;
    import java.io.IOException;
    import java.net.DatagramPacket;
    import java.net.DatagramSocket;
    import java.net.InetAddress;
    public class ReceiveDemo {
    	public static void main(String[] args) throws IOException {
    		//      Socket  
    		// DatagramSocket(int port)
    		DatagramSocket ds = new DatagramSocket(10086);
    		//        (    )
    		// DatagramPacket(byte[] buf, int length)
    		byte[] bys = new byte[1024];
    		int length = bys.length;
    		DatagramPacket dp = new DatagramPacket(bys, length);
    		//   Socket           
    		// public void receive(DatagramPacket p)
    		ds.receive(dp); //      
    		//      ,       
    		// dp     IP    :     ip
    		// public InetAddress getAddress()
    		InetAddress address = dp.getAddress();
    		String ip = address.getHostAddress();
    		// public byte[] getData():       
    		// public int getLength():         
    		byte[] bys2 = dp.getData();
    		int len = dp.getLength();
    		String s = new String(bys2, 0, len);
    		System.out.println(ip + "      :" + s);
    		//     
    		ds.close();
    	}
    }
    

     
    3、UDPネットワークプログラミングの最適化
    (1)UDPプロトコル送信データの最適化
    package cn.itcast_03;
    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 = "helloworld".getBytes();
    		DatagramPacket dp = new DatagramPacket(bys,bys.length,InetAddress.getByName("192.168.12.92"), 12345);
    		//     
    		ds.send(dp);
    		//     
    		ds.close();
    	}
    }
    

    (2)UDPプロトコル受信データの最適化
    package cn.itcast_03;
    import java.io.IOException;
    import java.net.DatagramPacket;
    import java.net.DatagramSocket;
    /*
     *        :java.net.BindException: Address already in use: Cannot bind
     *    :        。
     */
    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("from " + ip + " data is : " + s);
    		//     
    		ds.close();
    	}
    }