首页 > 解决方案 > 高频 Udp 多播发送:一段时间后 java.net.SocketException

问题描述

我开发了一个应用程序,它每秒在三个不同的多播 UDP 地址上发送大约 4 个数据包,每秒总共发送 12 个数据包。数据包很小,一个 50 字符的字符串。过了一会儿(20 分钟),所有处理数据包调度的线程都会启动异常:

java.net.SocketException: Invalid argument: no further information
    at sun.nio.ch.DatagramChannelImpl.send0(Native Method)
    at sun.nio.ch.DatagramChannelImpl.sendFromNativeBuffer(DatagramChannelImpl.java:521)
    at sun.nio.ch.DatagramChannelImpl.send(DatagramChannelImpl.java:483)
    at sun.nio.ch.DatagramChannelImpl.send(DatagramChannelImpl.java:462)
    at io.netty.channel.socket.nio.NioDatagramChannel.doWriteMessage(NioDatagramChannel.java:293)
    at io.netty.channel.nio.AbstractNioMessageChannel.doWrite(AbstractNioMessageChannel.java:142)
    at io.netty.channel.AbstractChannel$AbstractUnsafe.flush0(AbstractChannel.java:939)
    at io.netty.channel.nio.AbstractNioChannel$AbstractNioUnsafe.flush0(AbstractNioChannel.java:360)
    at io.netty.channel.AbstractChannel$AbstractUnsafe.flush(AbstractChannel.java:906)
    at io.netty.channel.DefaultChannelPipeline$HeadContext.flush(DefaultChannelPipeline.java:1370)
    at io.netty.channel.AbstractChannelHandlerContext.invokeFlush0(AbstractChannelHandlerContext.java:739)
    at io.netty.channel.AbstractChannelHandlerContext.invokeFlush(AbstractChannelHandlerContext.java:731)
    at io.netty.channel.AbstractChannelHandlerContext.flush(AbstractChannelHandlerContext.java:717)
    at io.netty.channel.ChannelDuplexHandler.flush(ChannelDuplexHandler.java:117)
    at io.netty.channel.AbstractChannelHandlerContext.invokeFlush0(AbstractChannelHandlerContext.java:739)
    at io.netty.channel.AbstractChannelHandlerContext.invokeFlush(AbstractChannelHandlerContext.java:731)
    at io.netty.channel.AbstractChannelHandlerContext.access$2100(AbstractChannelHandlerContext.java:38)
    at io.netty.channel.AbstractChannelHandlerContext$WriteAndFlushTask.write(AbstractChannelHandlerContext.java:1139)
    at io.netty.channel.AbstractChannelHandlerContext$AbstractWriteTask.run(AbstractChannelHandlerContext.java:1062)
    at io.netty.util.concurrent.AbstractEventExecutor.safeExecute(AbstractEventExecutor.java:163)
    at io.netty.util.concurrent.SingleThreadEventExecutor.runAllTasks(SingleThreadEventExecutor.java:404)
    at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:495)
    at io.netty.util.concurrent.SingleThreadEventExecutor$5.run(SingleThreadEventExecutor.java:905)
    at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30)
    at java.lang.Thread.run(Thread.java:748)

该应用程序在 Windows 10 和 JVM 1.8 上运行我怀疑问题与 SO 或 JVM 的数据报缓冲区有关。有任何想法吗?

标签: javanetworkingudpmulticastdatagram

解决方案


解决了。该问题与 System Operative UDP 端口饱和有关。正确修改代码,问题解决。


推荐阅读