寻找java.net.SocketException:没有可用的缓冲区空间

时间:2009-08-04 07:42:43

标签: java networking windows-xp sockets winsockets

嗨,我有一个非常难看的问题:     java.net.SocketException:没有可用的缓冲区空间(达到最大连接数?) 它是客户端 - 服务器应用程序。客户端是Windows XP SP2 32b,带有两个网卡核心二重奏。 Java 1.6。 U7。 应用程序有几个服务器套接字打开用于本地通信和几个客户端套接字用于rmi到jboss服务器。

经过几个小时/天!我无法打开任何新的客户端套接字与服务器进行通信。服务器套接字仍然有效。

Windows netstat显示130到150个连接。在~3500连接后手动尝试我耗尽缓冲区时!

我试过了:

  • 检查我们使用的每个套接字,我们也将其关闭。
  • 在后台运行netstat以监控已打开的连接
  • 运行病毒扫描以发现任何恶意软件
  • 将java更新为1.6 u16
  • 禁用第二个网络接口

  • 重新启动java后,我可以打开新连接。

    全部例外:

    cause:javax.naming.CommunicationException: Failed to connect to server IP:1099 [Root exception is javax.naming.ServiceUnavailableException: Failed to connect to server IP:1099 [Roo
    t exception is java.net.SocketException: No buffer space available (maximum connections reached?): JVM_Bind]]
    2009-08-03 09:13:18,968 DEBUG [Thread-9] - stack trace:
    2009-08-03 09:13:18,968 DEBUG [Thread-9] - org.jnp.interfaces.NamingContext.checkRef(NamingContext.java:1562)
    2009-08-03 09:13:18,968 DEBUG [Thread-9] - org.jnp.interfaces.NamingContext.lookup(NamingContext.java:634)
    2009-08-03 09:13:18,968 DEBUG [Thread-9] - org.jnp.interfaces.NamingContext.lookup(NamingContext.java:627)
    2009-08-03 09:13:18,968 DEBUG [Thread-9] - javax.naming.InitialContext.lookup(Unknown Source)
    

    - 编辑
    我们终于解决了snmp服务器故障的问题。我在下面的评论中写下了我的笔记。谢谢你的帮助。

    3 个答案:

    答案 0 :(得分:3)

    肯定听起来你在应用程序中以某种方式泄漏了套接字。

    • 检查您的代码是否始终关闭 它打开的套接字......即使在 一些例外的事件;即做 关闭finally区块。
    • 如果您的代码使用网址连接, 确保它们断开连接。
    • 我不是专家,但你的代码应该关闭它的InitialContext对象吗?

    答案 1 :(得分:1)

    我们尝试(并成功)杀死了这个问题。 JAVA   - 再次检查我们使用的每个插座,如果需要,请在一些特殊类别中注册   - 为每个打开套接字的类提供SocketFactory和ServerSocketFactory(例如jboss连接器)
      - 检查打开的文件,最后关闭它们   - URL也会打开连接,但如果您在此之后请求流,则连接将与流一起关闭(感谢Stephen)
    OS
      - 使用不同的java(1.5,1.6,1.7)
      - 安装新的驱动程序
      - 使用netstat并监控后台流量(使用脚本,是的win xp可以很好地完成脚本)。如果需要,请使用高级数据包嗅探器(线鲨?)   - win xp对并发连接有限制,请检查它们(谷歌)   - 一次又一次地检查病毒和商城软件(甚至在私人网络上!)

    答案 2 :(得分:0)

    阅读本link中提供的建议后!我能够在太短的时间内确定我经常使用isDisplayed()方式。因此,我在调用isDisplayed之间放置了5毫秒的等待时间。这解决了我的Socket Exception问题。

        for (final WebElement person: persons){
            if (person.isDisplayed()){
                dosomething;
                sleep 5 milliseconds
            }
        }
    

    如链接中所述,您应该插入一个try catch,以防万一这个等待时间不够长。