Java: Запустить HTTP-сервер по требованию из моего приложения? - PullRequest
1 голос
/ 20 апреля 2009

Я хочу написать простое тестовое приложение P2P , которое использует HTTP как базовый протокол.
Приложение должно решить по требованию , если оно должно выступать в роли HTTP-сервера или HTTP-клиента .

Классический способ, который мне известен, - это развертывание приложения на некоторые существующие HTTP-сервер. Но это неправильный путь для моего намерения. Должно быть иначе: сервер запускается приложением (и только если решит).

Есть ли способ выполнить серверную часть HTTP по требованию (без развертывания самого приложения на сервере)?

Можно ли сделать это, связав библиотеки Glassfish или Tomcat? и вызвать какой-нибудь "основной" метод?

Редактировать: ЭТО РАБОТАЕТ !!!
Я сейчас попробовал Jetty вместе с 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();
  }
}

Ответы [ 4 ]

2 голосов
/ 20 апреля 2009

Помимо других ответов, есть также NanoHTTPD . Он очень крошечный, всего в одном классе, и, возможно, это правильно, если вам не нужно больше или вы просто хотите, чтобы все было минимально.

2 голосов
/ 20 апреля 2009

Вы можете использовать Jetty или какой-либо другой встраиваемый HTTP-сервер. С сайта Jetty:

Jetty - проект с открытым исходным кодом, предоставляющий HTTP-сервер, HTTP-клиента и контейнер javax.servlet. Эти 100% -ные компоненты Java являются полнофункциональными, основанными на стандартах, компактными, встраиваемыми, асинхронными и масштабируемыми на предприятии. Jetty имеет двойную лицензию в соответствии с Apache License 2.0 и / или Eclipse Public License 1.0. Jetty бесплатна для коммерческого использования и распространения на условиях любой из этих лицензий.

1 голос
/ 20 апреля 2009

взгляните на проект restlet . Они предоставляют встраиваемый, автономный сервер и клиент, использующие один и тот же Java API (известный унифицированный интерфейс).

Glassfish, Tomcat или сервлет API кажутся мне немного излишними. Мой 0.02 $:)

EDIT

Клиент

 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();  
0 голосов
/ 20 апреля 2009

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://localhost:8000, чтобы увидеть ваш ответ.

В JavaDoc есть и другие примеры для пакета HttpServer

Если вы не можете гарантировать Java 6, взгляните на встраивание Jetty 6 , которое является простым и достаточно легким, то есть вам не нужно целое веб-приложение.

...