我们有一位客户正在使用我们的 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/