我在我的项目中使用 com.sun.net.httpserver.HttpServer。但是,似乎服务器在从 HTTP 连接获取无效数据时会泄漏连接。错误是这个:
http://bugs.sun.com/view_bug.do;jsessionid=dfe841c3152d878571573bafceb8?bug_id=6946825
现在,据报道这已在版本“7(b94)”中得到修复 - 但是,我们仍在使用 Java 1.6,此时我们不太可能想要切换 Java 版本。
所以,我正在寻找解决这种情况的方法。我没有太多时间,所以我更喜欢现在工作的快速解决方案,而不是稍后重新实现很多东西。
我对如何解决这个问题有一些想法:
- 更新到更新的 Java - 这是我不想做的事情。
- 找到一个仅包含更新版本的 com.sun.net.httpserver 的 jar,并确保该 jar 在系统 jar 之前加载。
- 找到 com.sun.net.httpserver 的替代品 - 我愿意在这里提供指点。
- 修改代码以与另一台嵌入式 HTTP 服务器一起使用,希望与当前的服务器没有太大不同。我可以在一定程度上重写服务器设置代码,但大多数接口应该保持不变。
- 反编译 com.sun.net.httpserver.ServerImpl 类,修复有问题的地方,然后将该单个类重新编译为它自己的 jar
但是,我愿意接受好的建议!
先感谢您。
修复现已实施并有效。如果其他人需要这些,我将在此处粘贴相关位:
final Field httpserverimpl_server = Class.forName("sun.net.httpserver.HttpServerImpl").getDeclaredField("server");
final Field httpsserverimpl_server = Class.forName("sun.net.httpserver.HttpsServerImpl").getDeclaredField("server");
final Field serverimpl_allconnections = Class.forName("sun.net.httpserver.ServerImpl").getDeclaredField("allConnections");
final Field httpconnection_closed = Class.forName("sun.net.httpserver.HttpConnection").getDeclaredField("closed");
httpserverimpl_server.setAccessible(true);
httpsserverimpl_server.setAccessible(true);
serverimpl_allconnections.setAccessible(true);
httpconnection_closed.setAccessible(true);
Object serverimpl = httpserverimpl_server.get(server);
Set allconnections = (Set)serverimpl_allconnections.get(serverimpl);
LinkedList<Object> toRemove = new LinkedList<Object>();
for (Object conn : allconnections) {
if (httpconnection_closed.getBoolean(conn)) {
toRemove.add(conn);
}
}
for (Object conn : toRemove) {
allconnections.remove(conn);
}