Джава:Запускать HTTP-сервер по запросу из моего приложения?

StackOverflow https://stackoverflow.com/questions/766154

  •  12-09-2019
  •  | 
  •  

Вопрос

Я хочу написать простой 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 что легко и довольно легко, т.е.вам не нужно целое веб-приложение.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top