Я использую 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 - это то, что я не хочу делать.
- Найдите jar, который содержит только более свежую версию com.sun.net.httpserverи убедитесь, что JAR загружается до того, как система JAR.
- Найти замену для com.sun.net.httpserver - я открыт для указателей здесь.
- Изменить код для работыс другим встроенным HTTP-сервером, который, вероятно, не слишком отличается от текущего.Я могу несколько переписать код установки сервера, но большинство интерфейсов должны остаться прежними.
- Декомпилируйте класс com.sun.net.httpserver.ServerImpl, исправьте ошибочные места и перекомпилируйте этот единственный класс длясобственная банка
Но я открыт для хороших предложений!
Заранее спасибо.
Исправление теперь реализовано и работает,Я вставлю сюда соответствующие биты, если кому-то еще понадобится:
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);
}