Java实现UDP通信

UDP 通信的基本概念

  • 无连接:UDP是一种无连接协议,发送数据之前不需要建立连接。
  • 不可靠:UDP不保证数据包的可靠传输,数据包可能会丢失。
  • 轻量级:由于不需要维护连接状态,UDP比TCP更轻量级。
  • 广播和多播:UDP支持广播和多播,适合于需要向多个接收者发送消息的应用场景。

UDP 是无连接的,所以我们不需要先建立连接,只需要指定 IP 和端口号。

Java 中的 UDP 编程

Java 通过 DatagramSocketDatagramPacket 类可以实现 UDP 通信:

  1. 发送消息:使用 DatagramSocket 来创建一个用于发送数据的 UDP 套接字。通过 DatagramPacket 将要发送的数据、目标 IP 地址和端口号封装成数据报,然后使用 send 方法发送数据。

  2. 接收消息:同样使用 DatagramSocket 来创建一个 UDP 套接字,但需要绑定到一个特定的端口,用于监听传入的数据报。利用 DatagramPacket 创建一个数据包作为接收缓冲区,然后调用 receive 方法接收数据。

  3. 区别:发送方不需要指定端口,可以使用任意可用端口发送数据。而接收方则必须绑定到一个特定的端口,以便监听和接收数据报。

入门例子

发送端

public class UdpClient {
    public static void main(String[] args) throws Exception {
        // 创建一个 UDP 套接字
        DatagramSocket socket = new DatagramSocket();

        // 要发送的数据
        byte[] data = "hello".getBytes();

        // 创建一个数据包,包含数据、数据长度、目标 IP 地址和端口号
        DatagramPacket packet = new DatagramPacket(
                data,                           
                data.length,                   
                InetAddress.getByName("127.0.0.1"),  
                10010              
        );

        // 发送数据包
        socket.send(packet);
        System.out.println("消息已发送~~~");

        // 关闭套接字
        socket.close();
    }
}

接收方

public class UdpServer {
    public static void main(String[] args) throws Exception {
        System.out.println("服务端启动~~~");

        // 创建一个 UDP 套接字,并绑定到指定端口(10010)
        DatagramSocket socket = new DatagramSocket(10010);

        // 用于接收数据的字节数组
        byte[] buffer = new byte[1024];

        // 创建一个数据包,用于接收数据
        DatagramPacket packet = new DatagramPacket(buffer, buffer.length);

        // 等待接收数据(阻塞调用)
        socket.receive(packet);

        // 从数据包中提取数据
        byte[] data = packet.getData();
        int length = packet.getLength();
        String receivedMessage = new String(data, 0, length); // 根据实际长度构建字符串
        System.out.println("收到数据: " + receivedMessage);
        socket.close();
    }
}

在这里插入图片描述

实时通信和多发多收

发送端

public class UdpClient {
    public static void main(String[] args) {
        // 创建一个 UDP 套接字
        try (DatagramSocket socket = new DatagramSocket();
             Scanner scanner = new Scanner(System.in)) {

            System.out.println("客户端启动,输入消息并按回车发送,输入 'exit' 退出:");

            while (true) {
                String message = scanner.nextLine();

                if ("exit".equalsIgnoreCase(message)) {
                    System.out.println("客户端退出");
                    break;
                }

                byte[] data = message.getBytes();
                // 创建数据包,包含数据、目标 IP 地址和端口号
                DatagramPacket packet = new DatagramPacket(
                        data,
                        data.length,
                        InetAddress.getByName("127.0.0.1"),
                        10010
                );
                socket.send(packet);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

接收方

public class UdpServer {
    public static void main(String[] args) {
        System.out.println("服务端启动,监听端口 10010");

        // 创建并绑定一个 UDP 套接字到端口 10010
        try (DatagramSocket socket = new DatagramSocket(10010)) {
            while (true) {
                // 用于接收数据的字节数组
                byte[] buffer = new byte[1024];

                // 创建数据包用于接收数据
                DatagramPacket packet = new DatagramPacket(buffer, buffer.length);

                // 接收数据包(阻塞调用)
                socket.receive(packet);

                // 从数据包中提取数据
                String receivedMessage = new String(packet.getData(), 0, packet.getLength());

                System.out.println(LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")) +"收到消息: " + receivedMessage);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

多发多收改一改就出来了


注意:UDP通信的形式

  • 单播:单台主机与单台主机之间的通信。
  • 广播:当前主机与所在网络中的所有主机通信。
  • 组播:当前主机与选定的一组主机的通信。

❤觉得有用的可以留个关注~~❤

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值