UDP简介

UDP:User Datagram Protocol,中文名称为用户数据报协议。

它为应用程序提供了一种无需建立连接就可以发送封装的 IP 数据包的方法。

UDP的特点是无连接、不可靠、快速传输。

UDP协议与TCP协议一样用于处理数据包,在OSI模型中,两者都位于传输层处于IP协议的上一层。UDP有不提供数据包分组、组装和不能对数据包进行排序的缺点,也就是说,当报文发送之后,是无法得知其是否安全完整到达的。UDP用来支持那些需要在计算机之间传输数据的网络应用。

通常音频、视频和普通数据在传送时使用UDP较多,因为它们即使偶尔丢失一两个数据包,也不会对接收结果产生太大影响。比如我们聊天用的ICQ和QQ就是使用的UDP协议。

UDP如何收发数据

UDP是可靠的网络协议,它在通信协议的两端各建立了一个Socket对象,但这两个指数发送,接收的对象。因此对于基于UDP协议的通信双方而言,没有所谓的客户端和服务器的概念。

Java提供了DatagramSocket类作为基于UDP协议的Socket。

UDP发送数据

UDP发送步骤

1、创建发送端的Socket对象(DatagramSocket);

2、创建数据,并把数据打包;

3、调用DatagramSocket对象的方法发送数据;

4、关闭发送端;

固定输入发送UDP
public static void main(String[] args) throws IOException {
        //创建发送端的Socket对象(DatagramSocket)
        DatagramSocket ds = new DatagramSocket();

        //创建数据,并把数据打包;
        String str = "你好呀,Java,我来啦";
        DatagramPacket dp = new DatagramPacket(str.getBytes(),str.getBytes().length,
                InetAddress.getByName("172.16.47.101"),10001);

        //️调用DatagramSocket对象的方法发送数据;
        ds.send(dp);
        //关闭发送端;
        ds.close();
    }
手动输入发送UDP

可以进一步优化,将写死的输入改为手动输入。

public static void main(String[] args) throws IOException {

        //创建发送端的Socket对象
        DatagramSocket ds = new DatagramSocket();
        //键盘录入
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        String line;
        while ((line = br.readLine()) != null){
            if ("88".equals(line)){
                break;
            }

            //创建数据,并把对象打包
            byte[] bytes = line.getBytes();
            DatagramPacket dp = new DatagramPacket(bytes,bytes.length, InetAddress.getByName("172.16.47.101"),12001);
            ds.send(dp);

        }
        //关闭数据源
        ds.close();
    }
代码运行输出结果

java udp syslog发超长包_网络协议

UDP接收数据

接收的步骤

1、创建接收端的Socket对象(DatagramSocket);

2、创建一个数据包,用于接收数据;

3、调用DatagramSocket对象的方法接收数据;

4、解析数据包,并把数据文档在控制台显示;

5、关闭接收端;

接收UDP发送的数据
public static void main(String[] args) throws IOException {
        //创建接收端的Socket对象(DatagramSocket);
        DatagramSocket ds = new DatagramSocket(12001);

        //创建一个数据包,用于接收数据;
        byte[] bytes = new byte[1024];
        DatagramPacket dp = new DatagramPacket(bytes,bytes.length);

        //调用DatagramSocket对象的方法接收数据;
        ds.receive(dp);

        byte[] datas = dp.getData();
        int length = dp.getLength();

        String dataStr = new String(datas,0,length);
        System.out.println("udp接收到的数据:" +dataStr);

        ds.close();

    }
代码运行输出结果

java udp syslog发超长包_java_02