UDP协议发送信息和接收信息

1 UDP协议

  • UDP ==>User Datagram Protocol :用户数据包协议

1.1 UDP特点

  • 面向无连接的协议发送端只管发送,不管接收端是否存在,同样接收端收到数据时,也不会向发送端反馈是否收到数据.

  • 发送数据大小限制在64KB以内.

  • 基于数据包传输数据:要将发送的内容,源和目的地封装到一个数据包,将数据包发送出去.

  • 因为是面向无连接,速度快但不可靠.

  • 1.2 应用场景

    • 即时通讯(QQ,微信,飞秋)

    • 在线视频

    • 网络语音电话

    1.3 利用UDP协议发送信息和接收信息

    • 发送端代码实现

    • //UDP协议发送端
      import java.io.IOException;
      import java.net.DatagramPacket;
      import java.net.DatagramSocket;
      import java.net.InetAddress;
      /*
       * DatagramSocket():创建发送端的Socket对象.
      void send(DatagramPacket p):发送数据包
      DatagramPacket(byte[]buf,int length,InentAddress address,int port):创建数据报包,buf表示接收的字节数组,
           length表示接受到的字节长度,address表示IP地址,port表示进程端口号.
       */
      public class UDPOutput {
      
      	public static void main(String[] args) throws IOException{
      		//创建发送端的Socket对象
      		DatagramSocket ds =new DatagramSocket();
      		/*DatagramPacket(byte[]buf,int length,InentAddress address,int port):创建数据报包,buf表示接收的字节数组,
      		length表示接受到的字节长度,address表示IP地址,port表示进程端口号.*/
      		String buf ="好好学习,努力向上";
      		DatagramPacket data =new DatagramPacket(buf.getBytes(),
      				buf.getBytes().length, InetAddress.getLocalHost(), 8087);
      		//发送数据报包
      		ds.send(data);
      		//释放资源
      		ds.close();
      	}
      }
      - 接收端代码实现
    import java.io.IOException;
    import java.net.DatagramPacket;
    import java.net.DatagramSocket;
    
    /*
     *  DatagramPacket(byte[]buf,int length)创建数据报包buf表示接受到的字节数组,length表示接受到的字节长度.
    DatagramSocket(int port):创建接收端的Socket对象并将其绑定本机指定的指定端口.
    void receive(DatagramPacket p):接受数据包
    
     */
    public class UDPInput {
    
    	public static void main(String[] args) throws IOException {
    		// 创建接收端的Socket对象并将其绑定本机指定的指定端口
    		DatagramSocket data = new DatagramSocket(64720);
    		// 创建接收端的数据报包
    		byte[] buf = new byte[1024];
    		DatagramPacket p = new DatagramPacket(buf, buf.length);
    		// 接收数据报包
    		data.receive(p);
    
    		// 获取接收的数据报包中数据长度
    		int len = p.getLength();
    		System.out.println(len);
    		// 打印接收到的数据
    		System.out.println(new String(buf, 0, len));
    		// 获取发动端的主机名和IP地址
    		String pathname = p.getAddress().getHostName();
    		String IP = p.getAddress().getHostAddress();
    		System.out.println(pathname);
    		System.out.println(IP);
    		// 获取发送端端口号
    		int port = p.getPort();
    		System.out.println(port);
    
    		// 关闭资源,释放端口号
    		data.close();
    	}
  • }
    
  • 1.3 利用UDP协议发送飞秋信息的代码实现



    import java.io.IOException;
    import java.net.DatagramPacket;
    import java.net.DatagramSocket;
    import java.net.InetAddress;
    
    /*
     * DatagramSocket():创建发送端的Socket对象.
    DatagramSocket(int port):创建接收端的Socket对象并将其绑定本机指定的指定端口.
    void send(DatagramPacket p):发送数据包
    void receive(DatagramPacket p):接受数据包
    方法: DatagramPacket(byte[]buf,int length)创建数据报包buf表示接受到的字节数组,length表示接受到的字节长度.
    DatagramPacket(byte[]buf,int length,InentAddress address,int port):创建数据报包,buf表示接收的字节数组,
    length表示接受到的字节长度,address表示IP地址,port表示进程端口号.
     */
    public class UDPOutputStream {
    
    	public static void main(String[] args) throws IOException {
    		//创建发送端的Socket对象
    		DatagramSocket data = new DatagramSocket();
    		//创建发送对象
    		String mun="好好学习java,学业有成之时来我公司上班!";
    		byte[]buf=addString(mun);
    		//创建数据报包,若此IP地址为"192.168.137.255",则代表此网段"192.168.137.XXX"下的所有用户
    		//飞秋的进程端口默认是2425
    		DatagramPacket p =new DatagramPacket(buf, buf.length,
    				InetAddress.getByName("192.168.137.1"),2425);
    		//发送数据报包
    		data.send(p);
    		//关闭资源,
    		data.close();
    	}
    	/*
    	 * 飞秋的信息发送格式:
    	 * "version:data:sender:IP:flag"
    	 * "版本号:发送时间:发送项目名称:发送端的IP地址:发送内容的标志位"
    	 */
    	public static byte[] addString(String mun) {
    		//版本号
    		String version ="1.0:";
    		//发送时间
    		long data =System.currentTimeMillis();
    		//发送项目名称
    		String sender ="马化腾:";
    		//发送端的IP地址
    		String IP="000.000.1.1:";
    		//标志位,发送文本信息的标志位是:32
    		String flag ="32:";
    		String bString=version+data+":"+sender+IP+flag+mun;
    		byte []buf=bString.getBytes();
    		return buf;
    	}
    }


你可能感兴趣的:(网络编程,java,UTP)