JAVA---udp数据的发送与接收

时间:2022-12-21 10:10:20

UDP特点

  • 无连接,不可靠,会造成数据丢失
  • 速度快,因为无需进行三次握手
  • 限制数据传输大小64K

先运行接收端,后运行发送端。

发送端

在没有运行接收端的情况下运行发送端是看不出效果的。
因为程序发送数据包,但是没有接收端,所以会造成数据包的丢失。

import java.net.*;
public class UdpSendDemo {
    public static void main(String[] args) throws Exception {
        //DatagramSocket类表示用来发送和接收(udp)数据报包的套接字。
        DatagramSocket ds = new DatagramSocket();

        //获取本机ip地址
        String localIp = InetAddress.getLocalHost().getHostAddress();

        //需要发送的数据
        byte[] buf = "Hello Udp".getBytes();

        //DatagramPacket(byte[] buf, int length, InetAddress address, int port)
        //构造数据报包,用来将长度为 length 的包发送到指定主机上的指定端口号。

        //将数据传送到本地ip,端口为9999
        DatagramPacket dp = new DatagramPacket(buf, buf.length, InetAddress.getByName(localIp), 9999);

        //发送数据报包
        ds.send(dp);

        //关闭资源
        ds.close();

        System.out.println("Done.");
    }
}

接收端

其中DatagramSocket 的receive是一个阻塞方法,它会一直等待,直到接收到数据或程序被关闭

import java.net.DatagramPacket;
import java.net.DatagramSocket;
public class UdpReceDemo {
    public static void main(String[] args) throws Exception {

        //创建udp服务对象,指定接收端口号为9999的报包
        DatagramSocket ds = new DatagramSocket(9999);

        //构造空的数据报包, 用于存储待会接收到的数据报包
        byte[] data = new byte[1024];
        DatagramPacket dp = new DatagramPacket(data, data.length);

        //接收数据
        ds.receive(dp);

        //显示数据
        String ipAddress = dp.getAddress().getHostAddress();
        int port = dp.getPort();
        String datas = new String(dp.getData(), 0, dp.getLength());
        System.out.println(ipAddress + "::" + datas + "::" + port);

        ds.close();
    }
}

END