Джава:Запускать HTTP-сервер по запросу из моего приложения?
Вопрос
Я хочу написать простой P2P тестовое приложение, которое использует HTTP в качестве базового протокола.
Приложение должно решать по требованию, если это будет действовать как HTTP-сервер, или как HTTP-клиент.
Классический способ, о котором я знаю, было бы развернуть приложение на некоторых существующий HTTP-сервер.Но это неправильный путь для моего намерения.Должно быть иначе:Сервер запускается с приложения (и только если оно решит).
Есть ли способ выполнить часть HTTP-сервера по требованию(без развертывания самого приложения на сервере)?
Могу ли я сделать это, связав библиотеки Glassfish или Tomcat и назвать какой -то «основной» метод?
Редактировать:ОНО РАБОТАЕТ!!!
я сейчас попробовал Пристань вместе с JAX-RS (Джерси) успешно!
Спасибо вам всем.
(класс REST тривиален и опущен)
пакет my.p2p;
import com.sun.jersey.spi.container.servlet.*;
import org.mortbay.jetty.*;
import org.mortbay.jetty.servlet.*;
public class Main {
public static void main(String[] args)
throws Exception {
ServletHolder holder = new ServletHolder(ServletContainer.class);
holder.setInitParameter("com.sun.jersey.config.property.resourceConfigClass",
"com.sun.jersey.api.core.PackagesResourceConfig");
holder.setInitParameter("com.sun.jersey.config.property.packages", "my.p2p.rest");
Server server = new Server(8000);
Context context = new Context(server, "/", Context.SESSIONS);
context.addServlet(holder, "/*");
server.start();
}
}
Решение
Вы можете использовать Пристань или какой-либо другой встраиваемый HTTP-сервер.С веб-сайта Джетти:
Jetty — это проект с открытым исходным кодом, предоставляющий HTTP-сервер, HTTP-клиент и контейнер javax.servlet.Эти 100% Java-компоненты являются полнофункциональными, основанными на стандартах, небольшими по размеру, встраиваемыми, асинхронными и масштабируемыми на уровне предприятия.Jetty имеет двойную лицензию Apache License 2.0 и/или Eclipse Public License 1.0.Jetty бесплатен для коммерческого использования и распространения в соответствии с условиями любой из этих лицензий.
Другие советы
Помимо других ответов есть еще НаноHTTPD.Он очень маленький, всего в одном классе, и, возможно, это то, что вам нужно, если вам не нужно больше или вы просто хотите, чтобы все было минимально.
взгляните на рестлет проект.Они предоставляют встраиваемый автономный сервер и клиент, использующие один и тот же Java API (знаменитый унифицированный интерфейс).
Glassfish, Tomcat или API сервлетов кажутся мне немного излишними.Мои 0,02$ :)
РЕДАКТИРОВАТЬ
Клиент
Client client = new Client(Protocol.HTTP);
client.get("http://127.0.0.1").getEntity().write(System.out);
Сервер
Restlet sayHello = new Restlet() {
@Override
public void handle(Request request, Response response) {
response.setEntity("Hello World!", MediaType.TEXT_PLAIN);
}
};
new Server(Protocol.HTTP, 80, sayHello).start();
Java 6 включает встроенный веб-сервер.Вы можете использовать его так:
HttpServer server = HttpServer.create(new InetSocketAddress(8000), 0);
server.createContext("/", new HttpHandler() {
@Override
public void handle(HttpExchange xchange) throws IOException {
String response = "This is the response";
xchange.sendResponseHeaders(200, response.length());
OutputStream os = xchange.getResponseBody();
os.write(response.getBytes());
os.close();
}
});
server.setExecutor(null);
server.start();
И затем доступ http://локальный хост:8000 чтобы увидеть ваш ответ.
В JavaDoc есть больше примеров для Пакет HTTPServer
Если вы не можете гарантировать Java 6, взгляните на встраивание Jetty 6 что легко и довольно легко, т.е.вам не нужно целое веб-приложение.