我正在开发一些使用大量数据报套接字的代码。如果不进行仔细编码,此数字可能会超出jvm所允许的最大值。使用-Dsun.net.maxDatagramSockets=x
并非总是一种选择。我有这样的代码:
/* opening this channel will bring us to the limit--the maximum allowed by the JVM */
DatagramChannel channel1 = DatagramChannel.open();
/* do some stuff with channel1 */
/* Close channel1, and dereference it */
channel1.close();
channel1 = null;
/* this throws SocketException */
DatagramChannel channel2 = DatagramChannel.open();
共享
DatagramChannel
(即使用receive()
)可能是另一种选择,但了解此处发生的情况将很有用。编辑:经过更多的工作来缩小实际代码中的问题,我发现代码片段过于简化。这里的想法是,在达到最大数量的
DatagramChannel
之后,只有在关闭另一个SocketChannel
后才创建一个新的。但是,我处理的是DatagramChannel
和close()
的混合体,问题是,即使我在处理频道时在频道上调用DatagramChannel
,我也必须确保频道在创建另一个之前,刚刚关闭的是一个SocketChannel
(而不是)。只是一个疏忽。 最佳答案
解决此问题的最佳方法是使用一组可重复使用的池套接字。我建议使用诸如netty之类的框架,以避免必须自己实现所有细节。