простой HTTP-сервер на Java с использованием только API Java SE - PullRequest
303 голосов
/ 17 сентября 2010

Есть ли способ создать базовый HTTP-сервер (поддерживающий только GET / POST) в Java, используя только API Java SE, без написания кода для ручного разбора HTTP-запросов и ручного форматирования HTTP-ответов? Java SE API прекрасно инкапсулирует функциональность HTTP-клиента в HttpURLConnection, но есть ли аналог для функциональности HTTP-сервера?

Просто чтобы прояснить, проблема, с которой я сталкиваюсь со многими примерами ServerSocket, которые я видел в Интернете, заключается в том, что они выполняют собственный анализ запросов, форматирование и обработку ошибок, что утомительно, подвержено ошибкам и вряд ли быть всеобъемлющим, и я пытаюсь избежать этого по этим причинам.

В качестве примера ручной манипуляции HTTP, которую я пытаюсь избежать:

http://java.sun.com/developer/technicalArticles/Networking/Webserver/WebServercode.html

Ответы [ 18 ]

5 голосов
/ 16 сентября 2012

Этот код лучше нашего, вам нужно всего лишь добавить 2 библиотеки: javax.servelet.jar и org.mortbay.jetty.jar .

Причал класса:

package jetty;

import java.util.logging.Level;
import java.util.logging.Logger;
import org.mortbay.http.SocketListener;
import org.mortbay.jetty.Server;
import org.mortbay.jetty.servlet.ServletHttpContext;

public class Jetty {

    public static void main(String[] args) {
        try {
            Server server = new Server();
            SocketListener listener = new SocketListener();      

            System.out.println("Max Thread :" + listener.getMaxThreads() + " Min Thread :" + listener.getMinThreads());

            listener.setHost("localhost");
            listener.setPort(8070);
            listener.setMinThreads(5);
            listener.setMaxThreads(250);
            server.addListener(listener);            

            ServletHttpContext context = (ServletHttpContext) server.getContext("/");
            context.addServlet("/MO", "jetty.HelloWorldServlet");

            server.start();
            server.join();

        /*//We will create our server running at http://localhost:8070
        Server server = new Server();
        server.addListener(":8070");

        //We will deploy our servlet to the server at the path '/'
        //it will be available at http://localhost:8070
        ServletHttpContext context = (ServletHttpContext) server.getContext("/");
        context.addServlet("/MO", "jetty.HelloWorldServlet");

        server.start();
        */

        } catch (Exception ex) {
            Logger.getLogger(Jetty.class.getName()).log(Level.SEVERE, null, ex);
        }

    }
} 

Класс сервлета:

package jetty;

import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class HelloWorldServlet extends HttpServlet
{
    @Override
    protected void doGet(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws ServletException, IOException
    {
        String appid = httpServletRequest.getParameter("appid");
        String conta = httpServletRequest.getParameter("conta");

        System.out.println("Appid : "+appid);
        System.out.println("Conta : "+conta);

        httpServletResponse.setContentType("text/plain");
        PrintWriter out = httpServletResponse.getWriter();
        out.println("Hello World!");
        out.close();
    }
}
5 голосов
/ 18 сентября 2010

Вы также можете взглянуть на некоторые фреймворки приложений NIO, такие как:

  1. Нетти: http://jboss.org/netty
  2. Apache Mina: http://mina.apache.org/ или его подпроект AsyncWeb: http://mina.apache.org/asyncweb/
3 голосов
/ 15 октября 2015

Выезд takes.Посмотрите на https://github.com/yegor256/takes для быстрой информации

3 голосов
/ 15 июля 2015

оформить заказ Простой . это довольно простой встраиваемый сервер со встроенной поддержкой для самых разных операций. Особенно мне нравится его модель с резьбой ..

Потрясающе!

2 голосов
/ 17 октября 2018

Все вышеперечисленные подробности ответов об однопотоковом обработчике запросов.

параметр:

 server.setExecutor(java.util.concurrent.Executors.newCachedThreadPool());

Позволяет отправлять несколько запросов через несколько потоков с использованием службы executor.

Таккод конца будет выглядеть примерно так:

import java.io.IOException;
import java.io.OutputStream;
import java.net.InetSocketAddress;
import com.sun.net.httpserver.HttpExchange;
import com.sun.net.httpserver.HttpHandler;
import com.sun.net.httpserver.HttpServer;
public class App {
    public static void main(String[] args) throws Exception {
        HttpServer server = HttpServer.create(new InetSocketAddress(8000), 0);
        server.createContext("/test", new MyHandler());
        //Thread control is given to executor service.
        server.setExecutor(java.util.concurrent.Executors.newCachedThreadPool());
        server.start();
    }
    static class MyHandler implements HttpHandler {
        @Override
        public void handle(HttpExchange t) throws IOException {
            String response = "This is the response";
            long threadId = Thread.currentThread().getId();
            System.out.println("I am thread " + threadId );
            response = response + "Thread Id = "+threadId;
            t.sendResponseHeaders(200, response.length());
            OutputStream os = t.getResponseBody();
            os.write(response.getBytes());
            os.close();
        }
    }
}
2 голосов
/ 12 февраля 2013

Как насчет проекта Apache Commons HttpCore ?

С веб-сайта: ... HttpCore Goals

  • Реализация самых фундаментальных аспектов транспорта HTTP
  • Баланс между хорошей производительностью и ясностью и выразительностью API
  • Небольшой (предсказуемый) объем памяти
  • Автономная библиотека (без внешних зависимостей, кроме JRE)
1 голос
/ 11 мая 2018

Попробуйте это https://github.com/devashish234073/Java-Socket-Http-Server/blob/master/README.md

Этот API-интерфейс создает HTTP-сервер с использованием сокетов.

  1. Он получает запрос от браузера в виде текста
  2. Анализирует его для получения информации об URL, метода, атрибутов и т. Д.
  3. Создает динамический ответ, используя сопоставление URLопределены
  4. Отправляет ответ в браузер.

Например, вот как конструктор в классе Response.java преобразует необработанный ответ в ответ http:

public Response(String resp){
    Date date = new Date();
    String start = "HTTP/1.1 200 OK\r\n";
    String header = "Date: "+date.toString()+"\r\n";
    header+= "Content-Type: text/html\r\n";
    header+= "Content-length: "+resp.length()+"\r\n";
    header+="\r\n";
    this.resp=start+header+resp;
}
1 голос
/ 29 июня 2017

Вы можете написать довольно простой встроенный Jetty Java-сервер.

Embedded Jetty означает, что сервер (Jetty) поставляется вместе с приложением, а не развертывается на внешнем сервере Jetty.

Таким образом, если при не встроенном подходе ваше веб-приложение встроено в файл WAR, который развернут на каком-либо внешнем сервере ( Tomcat / Jetty / и т. Д.), Во встроенном Jetty вы пишете веб-приложение и создаете экземпляр сервера Jetty та же самая база кода.

Примером для встроенного Java-сервера Jetty вы можете git clone и использовать: https://github.com/stas-slu/embedded-jetty-java-server-example

...