java - JNLP 打开太多连接并导致 BindException : Address already in use

标签 java sockets jnlp

我们有一位客户正在使用我们的 jnlp 打开应用程序。在此 .jnlp 中,大约有 30 个资源可供下载(例如 <jar href="https://url/to/resource.jar" download="lazy"/> )。我们可以注意到(通过 netstat -ano ),执行 jnlp 时会打开许多​​连接。

在我们的应用程序中,我们有一些代码下载一些文件,并在执行过程中出现异常 BindException: Address already in use当我们尝试调用HttpURLConnection#getInputStream()时抛出。如果我们尝试再次打开 jnlp,我们的应用程序甚至不会执行,因为抛出了相同的异常(这次是在 Java 控制台上)。如果我们等待几分钟并检查端口,我们可以看到它们已从 netstat -ano 中消失。然后我们再次尝试使用 jnlp 打开,并且应用程序中再次出现错误。

重要的是,当使用 java -jar 调用应用程序时,问题不会发生(因为不需要下载资源并且没有打开连接)。

此问题仅发生在一名客户身上,因此它一定与他们的配置有关。我们尝试添加MaxUserPort值为 65534 和 TcpTimedWaitDelay没有成功。该客户没有使用防火墙,也没有使用防病毒软件,但他们表示,一旦迁移到 Windows 终端服务器,问题就开始出现。他们的Java版本是8u101。

有什么想法可能会影响我们的应用程序以及解决它的方法吗?如有任何帮助,我们将不胜感激。

代码片段:

public InputStream connect(String urlToConnect) {
    URL url = null;
    InputStream is = null;

    try {
        url = new URL(urlToConnect);            
        HttpsURLConnection httpsConnection = (HttpsURLConnection) url.openConnection(); 
        is = httpsConnection.getInputStream();
    } catch (IOException e) {
        URLConnector.logger.error("Could not open connection on URL: "+urlToConnect+" -> "+e);
    } finally {
        if(is != null) {
            try { is.close(); } catch(IOException e){}
        }
    }

    return is;
}

最佳答案

解决了编辑打开 jnlp 文件的注册表:HKCR > JNLPFile > Shell > Open > Command。我使用了 ""C:\Program Files\Java\jre${VERSION}\bin\javaws.exe""%1"",而不是 ""C:\Program Files\Java\jre${VERSION}\bin\javaws.exe"-J-Dhttp.keepAlive=false "%1""

有关java中持久连接的更多信息可以找到here

关于java - JNLP 打开太多连接并导致 BindException : Address already in use,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39920105/

相关文章:

java - 如何获取运行 jnlp 的 URL?

java - 如何处理许多慢速连接

接收对象时出现 java.io.EOFException。客户端通过socket向服务器发送文件

java - JPopupMenu 显示大量信息时向上和向下的箭头

java - 多线程Java服务器

c++ - C/C++ 事件驱动监控非子程序的终止

java - 包 javax.jnlp 在模块 java.jnlp 中声明,它不在模块图中

Windows 7 中的 javaws 应用程序启动问题

java - 一种在java中实现部分类的方法

java - 如何在 Struts 2 中更改 JSESSIONID