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

时间:2016-10-07 14:50:26

标签: 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调用应用程序时,问题不会发生(因为资源不需要下载并且没有连接打开)。

这个问题只发生在一个客户身上,所以它必须与他们的配置有关。我们尝试添加值为65534和MaxUserPortTcpTimedWaitDelay但未成功。这个客户没有使用防火墙,也没有使用防病毒软件,但是他们说这个问题一旦迁移到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;
}

1 个答案:

答案 0 :(得分:0)

Solved it editing the registry that opens jnlp files: HKCR > JNLPFile > Shell > Open > Command. Instead of ""C:\Program Files\Java\jre${VERSION}\bin\javaws.exe" "%1"", I used ""C:\Program Files\Java\jre${VERSION}\bin\javaws.exe" -J-Dhttp.keepAlive=false "%1""

More info about Persistent Connections in java can be found here