Netty UDP 接收缓冲区 报文截取问题
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 接收缓冲区 报文截取问题相关推荐
- netty udp接收超过2048字节数据
默认netty udp接收DatagramPacket字节数最大是2048,如果数据大,超过这个限制,就会报错,抛出异常,虽然这个包解析失败,不会影响其他包的解析,但是总得来说,这种失败是不利于数据收 ...
- gprs发送信号对方如何接收_和接收缓冲区比较:Netty发送缓冲区是如何设计的,why?...
点击上方蓝字关注我吧! 本篇文章大概3300字,阅读时间大约10分钟 前面文章,透彻分析了Netty的接收缓冲区优化的套路和实现细节,以及写数据和刷新数据的宏观流程和细节: 从源码出发:在宏观上把握N ...
- TCP/UDP的接收缓冲区和发送缓冲区
转载自:https://blog.csdn.net/Swallow_he/article/details/84392285 1.TCP. SO_RCVBUF & TCP. SO_SNDBUF ...
- UDP Socket接收缓冲区与netstat Recv-Q
我们通常使用netstat查看网络的诸多状态,其中包含Send-Q与Recv-Q. 我们知道: 每一个Socket对象在系统中都被映射为一个Socket文件: 每一个Socket对象在系统中都关联有两 ...
- Netty消息接收类故障案例分析
<Netty 进阶之路>.<分布式服务框架原理与实践>作者李林锋深入剖析Netty消息接收类故障案例.李林锋此后还将在 InfoQ 上开设 Netty 专题持续出稿,感兴趣的同 ...
- 【Java 网络编程】UDP 服务器 客户端 通信 ( DatagramSocket | DatagramPacket | UDP 发送数据包 | UDP 接收数据包 | 端口号分配使用机制 )
文章目录 I UDP 信息发送接收原理 II UDP 发送和接收端口相同 III UDP 发送信息代码示例 IV UDP 接收信息代码示例 V UDP 服务器端代码示例 VI UDP 客户端代码示例 ...
- client netty 主动发数据_netty案例,netty4.1基础入门篇十一《netty udp通信方式案例Demo》...
小傅哥 | https://bugstack.cn 沉淀.分享.成长,让自己和他人都能有所收获.专注于原创专题案例编写,目前已完成的专题有:Netty4.x实战专题案例.用Java实现JVM.基于Ja ...
- tcp socket的发送与接收缓冲区
1)应用程序可通过调用send(write, sendmsg等)利用tcp socket向网络发送应 用数据, 而tcp/ip协议栈 再通 过 网络设备接口把已经组 织成struct sk_buff ...
- Kvaser Leaf light HS v2 | 如何使用Excel发送和接收CAN报文数据
从1980年代,Kvaser就开始CAN产品的研发,在相关产品开发领域有近40多年的经验,对CAN和相关总线技术有着非常深入的研究.我们将分享一些有趣的发现和一些特定情况的技术处理,欢迎关注❤️广州智 ...
最新文章
- python—多线程之信号量
- [云炬创业基础笔记]第七张创业团队测试7
- 最大子序列和问题的解(共4种,层层推进)
- 02_HBase集群部署
- 让数据库运行在浏览器里?TiDB + WebAssembly 告诉你答案
- 【早报】这届程序员要做好会Python的准备了!
- redis--服务器与客户端
- linux dhcp 绑定mac地址,●DHCP协议的功能是 (58) 。在Linux中提供DHCP服务的程序是 (59) ;DHCP服务将主机的MAC地址和IP地 - 赏学吧...
- PKU《程序设计导引及在线实践》刷题记录(上)
- FlashCS6安装步骤
- 博途v14电脑要求_博图TIA V14版本完整体验加测试
- vs2008 sp1 C++ 发布程序 .
- 前端 利用html实现分页切换效果
- Ubuntu下调用opencv编程显示汉字
- 我的周刊(第028期)
- JT/T 808-2013 道路运输车辆卫星定位系统北斗兼容车载终端通讯协议技术规范
- 【Mac 教程系列第 15 篇】如何查看 Mac 产品的序列号
- Clarifai的AI可检测图像和视频中的不合规内容
- 单片机C语言DA转换,51单片机PCF8591的DA转换程序详解[含HL-1与HJ-c52 DA代码AD/DA原理图](可直接复......
- iOS 3DES加密无盐值加密