UDP协议(UDP,DatagramSocket,DatagramPacket)

UDP协议

  • 用户数据报协议(User datagram  Protocol)
  • UDP是无连接通信协议,即在数据传输时,数据的发送端和接收端不建立逻辑连接。简单来说,当一台计算机向另外一台计算机发送数据时,发送端不会确认接收端是否存在,就会发送数据,同样接收端在收到数据时,也不会向发送端反馈是否收到数据。
  • 由于使用UDP协议消耗资源小,通信效率高,所以通常都会用于音频、视频和普通数据的传输

UDP通信原理

  • UDP协议是一种不可靠的网络协议,它在通信的两端各建立一个Socket对象,但是这两个Socket只是发送、接收数据的对象,因此对于基于UDP协议的通信双方而言 ,没有所谓的客户端和服务器的概念
  • Java提供了DatagramSocket类作为基于UDP协议的Socket

发送端代码示例: 

package com.wangLuo;

import java.io.IOException;
import java.net.*;

/**
 * @author 林高禄
 * @create 2020-05-21-17:05
 */
public class UDPSend {
    public static void main(String[] args) throws IOException {
        DatagramSocket ds = new DatagramSocket();
        String s = "我介绍个富婆给你,请务必接受";
        byte[] bytes = s.getBytes();
        DatagramPacket dp = new DatagramPacket(bytes,bytes.length,InetAddress.getByName("192.168.1.55"),10);
        ds.send(dp);
        ds.close();
    }
}

运行发送端,把数据发送出去,不管有没有存在接收端

接收端代码示例: 端口号定为10.,因为我们上面的发送端的端口号为10

package com.wangLuo;

import java.io.IOException;
import java.net.*;

/**
 * @author 林高禄
 * @create 2020-05-21-17:12
 */
public class UDPReceive {
    public static void main(String[] args) throws IOException {
        DatagramSocket ds = new DatagramSocket(10);
        byte[] by = new byte[1024];
        DatagramPacket dp = new DatagramPacket(by,by.length);
        ds.receive(dp);
        byte[] data = dp.getData();
        System.out.println(new String(data));
        ds.close();
    }
}

运行接收端,程序一直再等待,因为上一个发送端运行结束的时候,我们的接收端还没有运行,所以没有收到任何数据,接收端等待下一个发送端的数据

这时我们再运行发送端,发送端运行结束,看到接收端接收到数据输出:

UDP协议(UDP,DatagramSocket,DatagramPacket)_第1张图片

我们发现输出后面还对了很多空字符,是因为我们接收端把整个接收的Data大小转为字符串了,所以我们把代码改进,只转接收到的内容,截取含有内容的Data的长度

package com.wangLuo;

import java.io.IOException;
import java.net.*;

/**
 * @author 林高禄
 * @create 2020-05-21-17:12
 */
public class UDPReceive {
    public static void main(String[] args) throws IOException {
        DatagramSocket ds = new DatagramSocket(10);
        byte[] by = new byte[1024];
        DatagramPacket dp = new DatagramPacket(by,by.length);
        ds.receive(dp);
        byte[] data = dp.getData();
        int length = dp.getLength();
        System.out.println(new String(data,0,length));
        ds.close();
    }
}

这样拿到的就是实际的数据

基于这样,我们就用UDP协议做一个简单的聊天室。

 

你可能感兴趣的:(java基础)