410 Stimmen

Einfacher HTTP-Server in Java, der nur die Java SE API verwendet

Gibt es eine Möglichkeit, einen sehr einfachen HTTP-Server (der nur GET/POST unterstützt) in Java zu erstellen, indem man nur die Java SE API verwendet, ohne Code zu schreiben, um HTTP-Anfragen manuell zu parsen und HTTP-Antworten manuell zu formatieren? Die Java SE API kapselt die HTTP-Client-Funktionalität sehr gut in HttpURLConnection aber gibt es ein Analogon für die HTTP-Server-Funktionalität?

Nur um das klarzustellen: Das Problem, das ich mit einer Menge von ServerSocket Die Beispiele, die ich online gesehen habe, zeigen, dass sie ihre eigene Anfrageanalyse/Antwortformatierung und Fehlerbehandlung durchführen, was mühsam, fehleranfällig und wahrscheinlich nicht umfassend ist, und aus diesen Gründen versuche ich, es zu vermeiden.

7voto

ThiamTeck Punkte 385

Sie können sich auch einige NIO-Anwendungsframeworks ansehen, wie z. B.:

  1. Netty: http://jboss.org/netty
  2. Apache Mina: http://mina.apache.org/ oder sein Unterprojekt AsyncWeb: http://mina.apache.org/asyncweb/

7voto

Juraj Punkte 2714

Ein Beispiel für einen sehr einfachen HTTP-Server auf TCP-Socket-Ebene:

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;

public class NaiveHttpServer {

  public static void main(String[] args) throws IOException {
    String hostname = InetAddress.getLocalHost().getHostName();
    ServerSocket serverSocket = new ServerSocket(8089);
    while (true) {
      Socket clientSocket = serverSocket.accept();
      PrintWriter out = new PrintWriter(clientSocket.getOutputStream(), true);
      BufferedReader in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
      String s = in.readLine();
      System.out.println(s);
      while ("\r\n".equals(in.readLine())); 
      if ("GET /hostname HTTP/1.1".equals(s)) {
        out.println("HTTP/1.1 200 OK");
        out.println("Connection: close");
        out.println("Content-Type: text/plain");
        out.println("Content-Length:" + hostname.length());
        out.println();
        out.println(hostname);
      } else {
        out.println("HTTP/1.1 404 Not Found");
        out.println("Connection: close");
        out.println();    
      }
      out.flush();
    }
  }
}

Das Beispiel gibt den Hostnamen des Computers an.

6voto

leandro Punkte 61

Dieser Code ist besser als unserer, Sie müssen nur 2 Bibliotheken hinzufügen: javax.servelet.jar y org.mortbay.jetty.jar .

Klasse Jetty:

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);
        }

    }
} 

Servlet-Klasse:

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();
    }
}

5voto

Waldheinz Punkte 10318

Ich kann dringend empfehlen, sich mit folgenden Themen zu befassen Einfach Besonders dann, wenn Sie keine Servlet-Fähigkeiten benötigen, sondern lediglich Zugriff auf die Anfrage-/Antwort-Objekte. Wenn Sie REST brauchen, können Sie Jersey darauf setzen, wenn Sie HTML oder ähnliches ausgeben wollen, gibt es Freemarker. Ich finde es wirklich toll, was man mit dieser Kombination alles machen kann, und es gibt relativ wenig API zu lernen.

3voto

Zuko Punkte 2534

Zur Kasse Einfach . Es ist ein ziemlich einfacher, einbettbarer Server mit eingebauter Unterstützung für eine ganze Reihe von Operationen. Ich liebe vor allem seine Threading-Modell

Erstaunlich!

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X