我正在开发一些使用大量数据报套接字的代码。如果不仔细编码,这个数字可能会超过 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 的最大数量后,只有在关闭另一个 DatagramChannel 时才会创建新的。但是,我正在处理 SocketChannel
和 DatagramChannel
的混合情况,问题是,即使我在处理完 channel 后调用 close()
,我也必须确保刚刚关闭的 channel 是 DatagramChannel
(而不是 SocketChannel
),然后再创建另一个 channel 。只是一个疏忽。
最佳答案
处理此问题的最佳方法是使用一组可重用的池化套接字。我建议使用诸如 netty 之类的框架以避免必须自己实现所有具体细节。
关于java - 如何管理打开的数据报套接字以避免超过最大值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34795865/