如何管理打开的数据报套接字以避免超出最大值?

时间:2016-01-14 17:24:23

标签: java sockets datagram

我正在开发一些使用大量数据报套接字的代码。如果不仔细编码,这个数字可能会超过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 s(即使用receive())可能是另一种选择,但了解这里发生的事情会很有用。

编辑:经过一些工作来缩小实际代码中的问题,我发现代码片段太简单了。这里的想法是,在达到DatagramChannel的最大数量之后,只有在另一个关闭时才会创建一个新的SocketChannel。但是,我正在处理DatagramChannelclose() s的混合,问题是,即使我在通道上调用DatagramChannel,就像我对它们一样,我有在创建另一个频道之前,确保我刚关闭的频道是SocketChannel(而不是:checked)。只是一个疏忽。

1 个答案:

答案 0 :(得分:0)

处理此问题的最佳方法是使用一组可以重复使用的池化套接字。我建议使用netty这样的框架,以避免必须自己实现所有细节。