JNLP 打开太多连接并导致 BindException:地址已在使用中

JNLP opening too many connections and causing BindException: Address already in use

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

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

需要说明的是,使用java -jar调用应用时,不会出现的问题(因为不需要下载资源,也没有连接打开)。

这个问题只发生在一个客户身上,所以它一定与他们的配置有关。我们尝试添加 MaxUserPort with value 65534 and 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 > 打开 > 命令。我使用 ""C:\Program Files\Java\jre${VERSION}\bin\javaws.exe" -J-Dhttp.keepAlive=false "%1""

而不是 ""C:\Program Files\Java\jre${VERSION}\bin\javaws.exe" "%1""

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