netty(五)nio之UDP

476 阅读2分钟

「这是我参与11月更文挑战的第10天,活动详情查看:2021最后一次更文挑战」。

一、UDP简介

UDP是User Datagram Protocol的缩写。

即使是出现网络拥堵的情况下,UDP也无法进行流量控制等避免网络拥塞的行为。此外,传输途中即使出现丢包,UDP也不负责重发。甚至当出现包的到达顺序乱掉时也没有纠正的功能。

由于UDP面向无连接,它可以随时发送数据。再加上UDP本身的处理既简单又高效,因此经常用于以下几个方面:

1)包总量较少的通信(DNS、SNMP等)
2)视频、音频等多媒体通信(即时通信)
3)限定于LAN等特定网络中的应用通信

二、示例代码

使用UDP需要注意一下两点:
1)UDP是面向无连接的,client发送数据不会管server是否开启,也不关注是否成功失败。
2)server这边的receive方法会将接收到的数据存入bytebuffer,但如果数据报文超过buffer大小,多出来的数据会被抛弃。

x下面我们通过代码看下如何使用UDP:

服务端代码如下:

public class ServerTest {

    public static void main(String[] args) {
        // 开启UDP channel
        try (DatagramChannel channel = DatagramChannel.open()) {
            // 绑定端口
            channel.socket().bind(new InetSocketAddress(9999));
            System.out.println("waiting...");
            ByteBuffer buffer = ByteBuffer.allocate(32);
            // 接收消息,并写入buffer,此处方法阻塞
            channel.receive(buffer);
            // 切换buffer为读模式
            buffer.flip();
            System.out.println(print(buffer));
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    static String print(ByteBuffer b) {
        StringBuilder stringBuilder = new StringBuilder();
        for (int i = 0; i < b.limit(); i++) {
            stringBuilder.append((char) b.get(i));
        }
        return stringBuilder.toString();
    }
}

客户端代码:

public class ClientTest {

    public static void main(String[] args) {
        // 开启UDP channel
        try (DatagramChannel channel = DatagramChannel.open()) {
            // 初始化buffer,内容是hello
            ByteBuffer buffer = StandardCharsets.UTF_8.encode("hello");
            // 绑定服务端
            InetSocketAddress address = new InetSocketAddress("localhost", 9999);
            // 推送消息
            channel.send(buffer, address);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

如上代码所示,其中客户端的recieve方法时阻塞的,直到接收到消息。

服务端结果输出如下所示:

waiting...
hello

即使客户端启动时,服务端没有启动,客户端也不会有任何异常。


关于UDP这里只做简单的介绍和使用方法,有用话,兄弟们点个赞~~