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