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

标签 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(即使用receive())可能是另一种选择,但了解这里发生的情况会很有用。

编辑:在缩小实际代码中的问题范围之后,我发现代码片段过于简化。这里的想法是,在达到 DatagramChannel 的最大数量后,只有在关闭另一个 DatagramChannel 时才会创建新的。但是,我正在处理 SocketChannelDatagramChannel 的混合情况,问题是,即使我在处理完 channel 后调用 close(),我也必须确保刚刚关闭的 channel 是 DatagramChannel(而不是 SocketChannel),然后再创建另一个 channel 。只是一个疏忽。

最佳答案

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

关于java - 如何管理打开的数据报套接字以避免超过最大值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34795865/

相关文章:

node.js - 处理断开/注销事件

C# 套接字 : synchronous calls within asynchronous ones

java - Spark 使用编码器创建数据集,其中 row 是数组类型

java - 将 URL 中的 + 替换为其等效的 unicode

java - 在 .properties 文件中添加注释

Linux 套接字传输正在添加额外的零填充

java - 为什么我的数据报套接字停止接收数据,即使它接收的数据完全正常?

java - 为什么 Java DatagramSocket 在确定连接时在 "isConnected"上返回 false?

c - Unix 域套接字 : Using datagram communication between one server process and several client processes

java - Java中的循环链表实现