Netty UDP 报文截取问题

问题

  • 最近在写一个 syslog udp 日志接收器,然后发现接收过大的日志数据会被截断,拿到的信息不完整

源码追踪

创建 udp server 的示例代码

       def b = new Bootstrap()group = new NioEventLoopGroup()b.group(group).channel(NioDatagramChannel.class).localAddress(config.udp.port).handler(new ChannelInitializer<DatagramChannel>() {@Overrideprotected void initChannel(DatagramChannel datagramChannel) throws Exception {ChannelPipeline channelPipeline = datagramChannel.pipeline()channelPipeline.addLast(new UDPSyslogMessageDecoder(),new SyslogMessageHandler())if (config.log) {channelPipeline.addLast(new SyslogMessageLogHandler())}channelPipeline.addLast(new QianxinLogHandler(vertx,config))}})startFuture = b.bind().sync()

NioDatagramChannel 初始化源码追踪

channel 使用 NioDatagramChannel ,追踪 NioDatagramChannel 源码

  • 初始化 NioDatagramChannel
    io.netty.channel.socket.nio.NioDatagramChannel.NioDatagramChannel()
    public NioDatagramChannel() {this(newSocket(DEFAULT_SELECTOR_PROVIDER));}
  • 调用构造方法
    io.netty.channel.socket.nio.NioDatagramChannel#NioDatagramChannel(java.nio.channels.DatagramChannel)
    public NioDatagramChannel(DatagramChannel socket) {super(null, socket, SelectionKey.OP_READ);config = new NioDatagramChannelConfig(this, socket);}
  • 初始化 NioDatagramChannelConfig 配置信息
    io.netty.channel.socket.nio.NioDatagramChannelConfig.NioDatagramChannelConfig
    NioDatagramChannelConfig(NioDatagramChannel channel, DatagramChannel javaChannel) {super(channel, javaChannel.socket());this.javaChannel = javaChannel;}
  • 调用父类构造方法
    io.netty.channel.socket.DefaultDatagramChannelConfig#DefaultDatagramChannelConfig
    public DefaultDatagramChannelConfig(DatagramChannel channel, DatagramSocket javaSocket) {// 初始化 2048 字节的固定长度的接收缓冲区super(channel, new FixedRecvByteBufAllocator(2048));this.javaSocket = ObjectUtil.checkNotNull(javaSocket, "javaSocket");}

原因

NioDatagramChannel 默认缓冲区大小只给了 2048 ,开发一个 Syslog UDP 协议服务,日志大小其实就不止这么点,所以日志被截取一部分导致问题出现

解决方法

构建 Bootstrap 增加参数选项,把默认 2048 固定缓冲区调大

实际构建代码如下:

       def b = new Bootstrap()group = new NioEventLoopGroup()b.group(group).channel(NioDatagramChannel.class).localAddress(config.udp.port)// 增加下面这一行代码 固定 64 k大小,这个根据实际情况调整.option(ChannelOption.RCVBUF_ALLOCATOR, new FixedRecvByteBufAllocator(65535)).handler(new ChannelInitializer<DatagramChannel>() {@Overrideprotected void initChannel(DatagramChannel datagramChannel) throws Exception {ChannelPipeline channelPipeline = datagramChannel.pipeline()channelPipeline.addLast(new UDPSyslogMessageDecoder(),new SyslogMessageHandler())if (config.log) {channelPipeline.addLast(new SyslogMessageLogHandler())}channelPipeline.addLast(new QianxinLogHandler(vertx,config))}})startFuture = b.bind().sync()

Netty UDP 接收缓冲区 报文截取问题相关推荐

  1. netty udp接收超过2048字节数据

    默认netty udp接收DatagramPacket字节数最大是2048,如果数据大,超过这个限制,就会报错,抛出异常,虽然这个包解析失败,不会影响其他包的解析,但是总得来说,这种失败是不利于数据收 ...

  2. gprs发送信号对方如何接收_和接收缓冲区比较:Netty发送缓冲区是如何设计的,why?...

    点击上方蓝字关注我吧! 本篇文章大概3300字,阅读时间大约10分钟 前面文章,透彻分析了Netty的接收缓冲区优化的套路和实现细节,以及写数据和刷新数据的宏观流程和细节: 从源码出发:在宏观上把握N ...

  3. TCP/UDP的接收缓冲区和发送缓冲区

    转载自:https://blog.csdn.net/Swallow_he/article/details/84392285 1.TCP. SO_RCVBUF & TCP. SO_SNDBUF ...

  4. UDP Socket接收缓冲区与netstat Recv-Q

    我们通常使用netstat查看网络的诸多状态,其中包含Send-Q与Recv-Q. 我们知道: 每一个Socket对象在系统中都被映射为一个Socket文件: 每一个Socket对象在系统中都关联有两 ...

  5. Netty消息接收类故障案例分析

    <Netty 进阶之路>.<分布式服务框架原理与实践>作者李林锋深入剖析Netty消息接收类故障案例.李林锋此后还将在 InfoQ 上开设 Netty 专题持续出稿,感兴趣的同 ...

  6. 【Java 网络编程】UDP 服务器 客户端 通信 ( DatagramSocket | DatagramPacket | UDP 发送数据包 | UDP 接收数据包 | 端口号分配使用机制 )

    文章目录 I UDP 信息发送接收原理 II UDP 发送和接收端口相同 III UDP 发送信息代码示例 IV UDP 接收信息代码示例 V UDP 服务器端代码示例 VI UDP 客户端代码示例 ...

  7. client netty 主动发数据_netty案例,netty4.1基础入门篇十一《netty udp通信方式案例Demo》...

    小傅哥 | https://bugstack.cn 沉淀.分享.成长,让自己和他人都能有所收获.专注于原创专题案例编写,目前已完成的专题有:Netty4.x实战专题案例.用Java实现JVM.基于Ja ...

  8. tcp socket的发送与接收缓冲区

    1)应用程序可通过调用send(write, sendmsg等)利用tcp socket向网络发送应 用数据, 而tcp/ip协议栈 再通 过 网络设备接口把已经组 织成struct  sk_buff ...

  9. Kvaser Leaf light HS v2 | 如何使用Excel发送和接收CAN报文数据

    从1980年代,Kvaser就开始CAN产品的研发,在相关产品开发领域有近40多年的经验,对CAN和相关总线技术有着非常深入的研究.我们将分享一些有趣的发现和一些特定情况的技术处理,欢迎关注❤️广州智 ...

最新文章

  1. python—多线程之信号量
  2. [云炬创业基础笔记]第七张创业团队测试7
  3. 最大子序列和问题的解(共4种,层层推进)
  4. 02_HBase集群部署
  5. 让数据库运行在浏览器里?TiDB + WebAssembly 告诉你答案
  6. 【早报】这届程序员要做好会Python的准备了!
  7. redis--服务器与客户端
  8. linux dhcp 绑定mac地址,●DHCP协议的功能是 (58) 。在Linux中提供DHCP服务的程序是 (59) ;DHCP服务将主机的MAC地址和IP地 - 赏学吧...
  9. PKU《程序设计导引及在线实践》刷题记录(上)
  10. FlashCS6安装步骤
  11. 博途v14电脑要求_博图TIA V14版本完整体验加测试
  12. vs2008 sp1 C++ 发布程序 .
  13. 前端 利用html实现分页切换效果
  14. Ubuntu下调用opencv编程显示汉字
  15. 我的周刊(第028期)
  16. JT/T 808-2013 道路运输车辆卫星定位系统北斗兼容车载终端通讯协议技术规范
  17. 【Mac 教程系列第 15 篇】如何查看 Mac 产品的序列号
  18. Clarifai的AI可检测图像和视频中的不合规内容
  19. 单片机C语言DA转换,51单片机PCF8591的DA转换程序详解[含HL-1与HJ-c52 DA代码AD/DA原理图](可直接复......
  20. iOS 3DES加密无盐值加密

热门文章

  1. Expanded 布局
  2. dpdk-20.11 学习篇 编译和安装
  3. 荣耀智慧屏搭载鸿蒙系统,搭载鸿蒙系统的荣耀智慧屏正式亮相
  4. value_counts()计数的用法
  5. LWN:内核热点: folio,多代LRU,以及Rust!
  6. 精读《Microsoft Power Fx》
  7. 石油和计算机的交叉研究
  8. 首席新媒体运营商学院黎想:教育机构4大用户增长策略
  9. APP测试心得和体会
  10. img 图片滚动展示