地球人都知道sun在jdk中六种自带了一个轻量级http server.
用它可以很容易实现一些轻量级的http服务,用来做测试和辅助工具很方便。
不过关于其的文档很少,参数调节等都没有文档说明,一切只能去看其源代码。
今天遇到一个问题:当客户端超过一定时间未发送数据,则连接被服务端自动关闭。
必须调整连接时间才行。
经过查找,JDK中,有个叫做ServerConfig的类,这里面设置了这个http server的一些必要参数,比如读取等待时间,写入等待时间等。
class ServerConfig {
static int clockTick;
static int defaultClockTick = 10000 ; // 10 sec.
/* These values must be a reasonable multiple of clockTick */
static long defaultReadTimeout = 20 ; // 20 sec.
static long defaultWriteTimeout = 60 ; // 60 sec.
static long defaultIdleInterval = 300 ; // 5 min
static long defaultSelCacheTimeout = 120 ; // seconds
static int defaultMaxIdleConnections = 200 ;
static long defaultDrainAmount = 64 * 1024;
static long readTimeout;
static long writeTimeout;
static long idleInterval;
static long selCacheTimeout;
static long drainAmount; // max # of bytes to drain from an inputstream
static int maxIdleConnections;
static boolean debug = false;
static {
idleInterval = ((Long)java.security.AccessController.doPrivileged(
new sun.security.action.GetLongAction(
"sun.net.httpserver.idleInterval",
defaultIdleInterval))).longValue() * 1000;
clockTick = ((Integer)java.security.AccessController.doPrivileged(
new sun.security.action.GetIntegerAction(
"sun.net.httpserver.clockTick",
defaultClockTick))).intValue();
maxIdleConnections = ((Integer)java.security.AccessController.doPrivileged(
new sun.security.action.GetIntegerAction(
"sun.net.httpserver.maxIdleConnections",
defaultMaxIdleConnections))).intValue();
readTimeout = ((Long)java.security.AccessController.doPrivileged(
new sun.security.action.GetLongAction(
"sun.net.httpserver.readTimeout",
defaultReadTimeout))).longValue()* 1000;
selCacheTimeout = ((Long)java.security.AccessController.doPrivileged(
new sun.security.action.GetLongAction(
"sun.net.httpserver.selCacheTimeout",
defaultSelCacheTimeout))).longValue()* 1000;
writeTimeout = ((Long)java.security.AccessController.doPrivileged(
new sun.security.action.GetLongAction(
"sun.net.httpserver.writeTimeout",
defaultWriteTimeout))).longValue()* 1000;
drainAmount = ((Long)java.security.AccessController.doPrivileged(
new sun.security.action.GetLongAction(
"sun.net.httpserver.drainAmount",
defaultDrainAmount))).longValue();
debug = ((Boolean)java.security.AccessController.doPrivileged(
new sun.security.action.GetBooleanAction(
"sun.net.httpserver.debug"))).booleanValue();
}
static long getReadTimeout () {
return readTimeout;
}
static long getSelCacheTimeout () {
return selCacheTimeout;
}
static boolean debugEnabled () {
return debug;
}
static long getIdleInterval () {
return idleInterval;
}
static int getClockTick () {
return clockTick;
}
static int getMaxIdleConnections () {
return maxIdleConnections;
}
static long getWriteTimeout () {
return writeTimeout;
}
static long getDrainAmount () {
return drainAmount;
}
}
从代码可知,修改这些细节参数,只要添加必要的java启动变量即可。
本文详细介绍了如何通过Java启动变量来修改JDK自带HTTPServer的连接超时时间设置,包括读取等待时间、写入等待时间等关键参数。通过调整这些参数,可以更好地控制HTTP服务的响应速度和资源使用。
848

被折叠的 条评论
为什么被折叠?



