【问题标题】:java.net.ConnectException: the system lacked sufficient buffer space or because a queue was fulljava.net.ConnectException:系统缺少足够的缓冲区空间或因为队列已满
【发布时间】:2012-08-13 22:41:05
【问题描述】:

我正在尝试通过以下代码 ping 各种 IP 来检查连接。

ipAdd = InetAddress.getByName(ipAddress);
            boolean isConnected = ipAdd.isReachable(3000);

但我收到此错误。

java.net.ConnectException: An operation on a socket could not be performed because the system lacked sufficient buffer space or because a queue was full

大约有 1000 个线程同时执行此过程。我曾考虑将这些 IP 保留在队列中。但为此我想知道我可以使用的最大线程数。有没有办法找出缓冲区空间,以便我可以计算出将同时触发的线程数,这些线程将运行上述代码。 除了排队方法之外,我将不胜感激任何其他解决方法/解决方案。

【问题讨论】:

  • 你今天googled了吗?
  • 我已经浏览了那个链接。我知道这是操作系统的限制,但我制作了一个单独的程序,我可以轻松地一次达到 3000 个 IP。但是在我的应用程序代码中,它本身就显示了 1000 个线程的错误。
  • 在调用 isReachable 方法时是否打开任何连接。如果是,那么是否需要关闭它?也让我知道怎么做。

标签: java windows sockets


【解决方案1】:

我猜这个异常的发生是因为你已经超出了你的应用程序可以使用的端口限制。
你会关闭你的连接吗?

【讨论】:

  • 我正在关闭所有套接字。但只有当该 IP 可访问时才会创建套接字。异常发生在 isReachable 方法调用处。一次大约有 1000 个 isReachable 调用(1000 个线程)
  • 好吧,即使 Socket 是稍后创建的,物理上,java 也必须保留一个端口来检查地址是否可达。如果这些端口没有被释放,那可能会溢出你的池。
  • 你能告诉我怎么做吗?在这个 boolean isConnected = ipAdd.isReachable(3000);
猜你喜欢
  • 1970-01-01
  • 2013-06-14
  • 1970-01-01
  • 2011-05-23
  • 2011-02-11
  • 1970-01-01
  • 2014-12-12
  • 1970-01-01
  • 2015-12-18
相关资源
最近更新 更多