netty(五)nio之UDP

作者: 我犟不过你 | 来源:发表于2021-11-05 10:09 被阅读0次

    一、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大小,多出来的数据会被默默抛弃。

    服务端代码如下:

    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这里只做简单的介绍和使用方法,有用话,兄弟们点个赞~~

    相关文章

      网友评论

        本文标题:netty(五)nio之UDP

        本文链接:https://www.haomeiwen.com/subject/ndalzltx.html