Netty 权威指南之UDP 协议开发

傷城~ 2023-10-16 21:50 86阅读 0赞

本章相关知识点:

UDP是用户数据报协议(User Datagrame Protocol,UDP)的简称,其主要作用是将网络数据流量压缩成数据报形式,提供面向事务的简单信息传送服务。与TCP协议不同,UD协议直接利用IP协议进行UDP数据报的传输,UDP提供的是 面向无连接的,不可靠的数据报投递服务。当使用UDP协议传输信息时,用户应用程序必须负责解决数据包丢失、重复、排序,差错确认等问题。

由于UDP具有销毁小、处理速度快的优点,所以通常视频、音频等可靠性要求不高的数据传输一般会使用UDP,及时有一定的丢包率,也不会对功能造成严重的影响。

本章学习目标:

1、UDP协议介绍

2、UDP服务端开发

3、UDP客户端开发

4、运行UDP项目

第一节:UDP协议介绍

UDP协议介绍:

UDP是无连接的,通信双方不需要建立物理链路连接。在网络中它用于处理数据包,在OSI模式中,它处于第四层传输层,即位于IP协议的上一层。它不对数据包分组、组装、校验和排序。因此是不可。报文的发送者不知道报文是否被对方接受。

UDP数据报格式有首部和数据两部分,首部很简单,为8个字节,包括以下部分:

1、源端口:源端口号,2个字节,最大值为65535;

2、目的端口:目的端口号,2个字节,最大值为65535;

3、长度:2个字节,UDP用户数据报的总长度;

4、校验:2字节,用于校验UDP的数据报的数字段和包含UDP数据报首部的”伪首部“。其校验方法类型IP分组首部中的首部校验。

伪首部,又称伪包头:是指在TCP的分段或UDP的数据报格式中,在数据报首部前面添加源IP地址、目的IP地址、IP分组的协议字段、TCP或UDP数据报的总长度,共12字节,所构成的拓展首部结构。此伪首部是一个临时的结构,它级部向上也不向下传递,仅仅是为了保证可以校验套接字的正确性。

Center

UDP协议的特定如下:

1、UDP传送数据前并不与对方建立连接,即UDP是无连接的。在传输数据前,发送方和接受方相互交互信息使双方同步;

2、UDP对接受到的数据包不发送确认信号,发送端不知道数据是否被正确接受,也不会重新发送数据。

3、UDP传输数据比TCP快,系统开销少;UDP笔记简单,UDP头包含了源端口、目的端口、消息长度和校验等很少的字节。由于UDP比TCP简单、灵活,常用于可靠性要求不高的数据传输,如视频、图片及简单文件系统传输(TFTP)等。TCP则适用于可靠性要求高实时性要求不高的应用,比如文件传输协议FTP、超文本传输协议HTTP和简单邮件传输协议SMTP等。

第二节:UDP服务端开发

ChineseProverbServer.java

  1. package com.nio.udp;
  2. import io.netty.bootstrap.Bootstrap;
  3. import io.netty.channel.ChannelOption;
  4. import io.netty.channel.EventLoopGroup;
  5. import io.netty.channel.nio.NioEventLoopGroup;
  6. import io.netty.channel.socket.nio.NioDatagramChannel;
  7. /**
  8. * Created by vixuan-008 on 2015/6/25.
  9. */
  10. public class ChineseProverbServer {
  11. public void run(int port) throws Exception {
  12. EventLoopGroup group = new NioEventLoopGroup();
  13. try {
  14. Bootstrap b = new Bootstrap();
  15. b.group(group).channel(NioDatagramChannel.class)
  16. .option(ChannelOption.SO_BROADCAST, true)
  17. .handler(new ChineseProverbServerHandler());
  18. b.bind(port).sync().channel().closeFuture().await();
  19. } finally {
  20. group.shutdownGracefully();
  21. }
  22. }
  23. public static void main(String[] args) throws Exception {
  24. int port = 17889;
  25. new ChineseProverbServer().run(port);
  26. }
  27. }

ChineseProverbServerHandler.java

  1. package com.nio.udp;
  2. import io.netty.buffer.Unpooled;
  3. import io.netty.channel.ChannelHandlerContext;
  4. import io.netty.channel.SimpleChannelInboundHandler;
  5. import io.netty.channel.socket.DatagramPacket;
  6. import io.netty.util.CharsetUtil;
  7. import io.netty.util.internal.ThreadLocalRandom;
  8. /**
  9. * Created by vixuan-008 on 2015/6/25.
  10. */
  11. public class ChineseProverbServerHandler extends SimpleChannelInboundHandler<DatagramPacket> {
  12. // 谚语列表
  13. private static final String[] DICTIONARY = { "只要功夫深,铁棒磨成针。",
  14. "旧时王谢堂前燕,飞入寻常百姓家。", "洛阳亲友如相问,一片冰心在玉壶。", "一寸光阴一寸金,寸金难买寸光阴。",
  15. "老骥伏枥,志在千里。烈士暮年,壮心不已!" };
  16. private String nextQuote() {
  17. int quoteId = ThreadLocalRandom.current().nextInt(DICTIONARY.length);
  18. return DICTIONARY[quoteId];
  19. }
  20. @Override
  21. public void messageReceived(ChannelHandlerContext ctx, DatagramPacket packet)
  22. throws Exception {
  23. String req = packet.content().toString(CharsetUtil.UTF_8);
  24. System.out.println("server receiver message is:"+req);
  25. if ("12345".equals(req)) {
  26. ctx.writeAndFlush(new DatagramPacket(Unpooled.copiedBuffer(
  27. "result: " + nextQuote(), CharsetUtil.UTF_8), packet
  28. .sender()));
  29. }
  30. }
  31. @Override
  32. public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause)
  33. throws Exception {
  34. ctx.close();
  35. }
  36. }

Center 1

第三节:UDP 客户端开发

ChineseProverbClient.java

  1. package com.nio.udp;
  2. import io.netty.bootstrap.Bootstrap;
  3. import io.netty.buffer.Unpooled;
  4. import io.netty.channel.Channel;
  5. import io.netty.channel.ChannelOption;
  6. import io.netty.channel.EventLoopGroup;
  7. import io.netty.channel.nio.NioEventLoopGroup;
  8. import io.netty.channel.socket.DatagramPacket;
  9. import io.netty.channel.socket.nio.NioDatagramChannel;
  10. import io.netty.util.CharsetUtil;
  11. import java.net.InetSocketAddress;
  12. /**
  13. * Created by vixuan-008 on 2015/6/25.
  14. */
  15. public class ChineseProverbClient {
  16. public void run(int port) throws Exception {
  17. EventLoopGroup group = new NioEventLoopGroup();
  18. try {
  19. Bootstrap b = new Bootstrap();
  20. b.group(group).channel(NioDatagramChannel.class)
  21. .option(ChannelOption.SO_BROADCAST, true)
  22. .handler(new ChineseProverbClientHandler());
  23. Channel ch = b.bind(0).sync().channel();
  24. // 向网段内的所有机器广播UDP消息
  25. ch.writeAndFlush(
  26. new DatagramPacket(Unpooled.copiedBuffer("12345",
  27. CharsetUtil.UTF_8), new InetSocketAddress(
  28. "255.255.255.255", port))).sync();
  29. if (!ch.closeFuture().await(15000)) {
  30. System.out.println("查询超时!");
  31. }
  32. } finally {
  33. group.shutdownGracefully();
  34. }
  35. }
  36. public static void main(String[] args) throws Exception {
  37. int port = 17889;
  38. new ChineseProverbClient().run(port);
  39. }
  40. }

ChineseProverbClientHandler.java

  1. package com.nio.udp;
  2. import io.netty.channel.ChannelHandlerContext;
  3. import io.netty.channel.SimpleChannelInboundHandler;
  4. import io.netty.channel.socket.DatagramPacket;
  5. import io.netty.util.CharsetUtil;
  6. /**
  7. * Created by vixuan-008 on 2015/6/25.
  8. */
  9. public class ChineseProverbClientHandler extends SimpleChannelInboundHandler<DatagramPacket> {
  10. @Override
  11. public void messageReceived(ChannelHandlerContext ctx, DatagramPacket msg)
  12. throws Exception {
  13. String response = msg.content().toString(CharsetUtil.UTF_8);
  14. System.out.println("client receiver message:"+response);
  15. ctx.close();
  16. }
  17. @Override
  18. public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause)
  19. throws Exception {
  20. ctx.close();
  21. }
  22. }

第四节:运行UDP应用

客户端截图:

Center 2

服务端截图:
Center 3

发表评论

表情:
评论列表 (有 0 条评论,86人围观)

还没有评论,来说两句吧...

相关阅读

    相关 Netty权威指南文件传输

    本章相关知识点: 文件是最常见的数据源之一,在程序经常需要将数据存储到文件中,比如:图片文件、声音文件等数据文件。在实际使用中,文件都包含一个特定的格式,这个格式需要程序员根

    相关 Netty权威指南AIO编程

    由JDK1.7提供的NIO2.0新增了异步的套接字通道,它是真正的异步I/O,在异步I/O操作的时候可以传递信号变量,当操作完成后会回调相关的方法,异步I/o也被称为AIO,对