2009-07-27 23 views
31

Chciałbym osadzić bardzo lekki serwer HTTP w mojej aplikacji do przechwytywania java, która akceptuje żądania, wykonuje pewne akcje i zwraca wyniki.Wbudowany serwer HTTP w aplikacji Swing Java

Czy istnieje bardzo lekka klasa java, której mogę używać w mojej aplikacji, która nasłuchuje na określonym porcie dla żądań HTTP i pozwala mi obsługiwać żądania?

Uwaga: nie szukam samodzielnego serwera http, tylko niewielkiej klasy języka Java, której mogę używać w mojej aplikacji java.

Odpowiedz

67

Niespodziewanie, Sun JDK zawiera już prostą implementację serwera http (tylko wychodząc z JDK 6). Zobacz JavaDoc

Usage:

import java.io.IOException; 
import java.io.OutputStream; 
import java.net.InetSocketAddress; 
import java.util.Iterator; 
import java.util.List; 
import java.util.Set; 
import java.util.concurrent.Executors; 

import com.sun.net.httpserver.Headers; 
import com.sun.net.httpserver.HttpExchange; 
import com.sun.net.httpserver.HttpHandler; 
import com.sun.net.httpserver.HttpServer; 

public class HttpServerDemo { 
    public static void main(String[] args) throws IOException { 
    InetSocketAddress addr = new InetSocketAddress(8080); 
    HttpServer server = HttpServer.create(addr, 0); 

    server.createContext("/", new MyHandler()); 
    server.setExecutor(Executors.newCachedThreadPool()); 
    server.start(); 
    System.out.println("Server is listening on port 8080"); 
    } 
} 

class MyHandler implements HttpHandler { 
    public void handle(HttpExchange exchange) throws IOException { 
    String requestMethod = exchange.getRequestMethod(); 
    if (requestMethod.equalsIgnoreCase("GET")) { 
     Headers responseHeaders = exchange.getResponseHeaders(); 
     responseHeaders.set("Content-Type", "text/plain"); 
     exchange.sendResponseHeaders(200, 0); 

     OutputStream responseBody = exchange.getResponseBody(); 
     Headers requestHeaders = exchange.getRequestHeaders(); 
     Set<String> keySet = requestHeaders.keySet(); 
     Iterator<String> iter = keySet.iterator(); 
     while (iter.hasNext()) { 
     String key = iter.next(); 
     List values = requestHeaders.get(key); 
     String s = key + " = " + values.toString() + "\n"; 
     responseBody.write(s.getBytes()); 
     } 
     responseBody.close(); 
    } 
    } 
} 

Albo można użyć Jetty do tego celu. Jest dość lekki i idealnie do tego pasuje.

+3

Dziękujemy za chęć i dostarczenie przykładowego kodu.To powinno być idealne dla moich potrzeb, okrzyki – CodeAndCats

+0

Przepraszamy, mogę zadać jeszcze jedno pytanie związane z tym przykładem? Uruchomienie tego przykładu, po uruchomieniu serwera Jestem nie wiesz, jak do cholery, aby zatrzymać wątek, który jest uruchomiony? Na przykład, jeśli klient żąda specjalnego adresu URL, który mówi mu, aby zamknąć, mogę zatrzymać serwer przez wywołanie server.stop (0), ale sama aplikacja wydaje się nadal być działa? – CodeAndCats

+0

@Ivan - Czy możesz mi powiedzieć, w jaki sposób można przekierować do łącza z komunikatem alertu z metody obsługi? Dziękuję – JHS

8

Możesz używać pomostu jako wbudowanego serwera, jego dość lekka waga. Inną opcją jest wybranie prostej klasy java do obsługi żądań http http://java.sun.com/developer/technicalArticles/Networking/Webserver/.

Inny sposób jest w Javie 6 można użyć com.sun.net.httpserver.HttpServer

+0

Serwer WWW Java 6 to najlepsze rozwiązanie, jeśli Twoja aplikacja jest wdrażana na platoformach z Java 6. – Dave

+0

@Dave i Oracle JVM. –

+0

Pomost nie działa w systemie Android. :( – tse

1

Jeśli nie korzystasz z Java 6, to z pewnością polecam Jetty. To działa bardzo dobrze i ma przyzwoity interfejs programistyczny.

1

Dwa razy powiedziałeś "bardzo lekki", więc myślę, że JLHTTP może być dla ciebie dobrym wyborem. Można go osadzić jako pojedynczy plik źródłowy lub plik jar o rozmiarze ~ 35K/50K, ale obsługuje on większość funkcji, których potrzebujesz w serwerze HTTP po wyjęciu z pudełka.

Nota prawna: Jestem autorem. Ale sprawdź sam i zobacz, co myślisz :-)

+0

coś takiego istnieje dla websockets? –

+1

Rozważałem dodanie do JLHTTP obsługi websocket, ale jest zbyt różne i zbyt duże, aby stać się częścią JLHTTP. Może któregoś dnia zrobię to w oddzielnym programie dla rodzeństwa ... – amichair