2009-07-27 16 views
31

Desidero incorporare un server HTTP molto leggero nella mia app java swing che accetta solo richieste, esegue alcune azioni e restituisce i risultati.Server HTTP incorporato nell'app di Swing Java

C'è una classe java molto leggera che posso utilizzare nella mia app che ascolta su una porta specificata per richieste Http e mi consente di gestire le richieste?

Nota che non sto cercando un server http standalone, solo una piccola classe java che posso usare nella mia app java.

risposta

67

Sorprendentemente, Sun JDK contiene già un'implementazione del server http semplice (solo a partire dal JDK 6). Vedere 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(); 
    } 
    } 
} 

Oppure è possibile utilizzare Jetty a tale scopo. È abbastanza leggero e si adatta perfettamente a questo scopo.

+3

Grazie per il miglio supplementare e fornendo codice di esempio.Questo dovrebbe essere perfetto per i miei bisogni, evviva! – CodeAndCats

+0

Scusa potrei farti un'altra domanda relativa a questo esempio? Esecuzione di questo esempio, una volta avviato il server sono Non so come diamine fermare il thread su cui è in esecuzione? Ad esempio, se un client richiede un URL speciale che gli dice di chiudere, posso fermare il server chiamando server.stop (0) ma l'app stessa sembra essere ancora in esecuzione? – CodeAndCats

+0

@Ivan - Puoi dirmi come posso reindirizzare a un collegamento con un messaggio di avviso dal metodo handle? Grazie. – JHS

8

È possibile utilizzare il molo come server incorporato, è piuttosto leggero. Un'altra opzione è controllare questo per una semplice classe java per gestire le richieste http http://java.sun.com/developer/technicalArticles/Networking/Webserver/.

altro modo è in Java 6 è possibile utilizzare com.sun.net.httpserver.HttpServer

+0

Il server Web Java 6 è la soluzione migliore se la tua app è distribuita su piattaforme con Java 6. – Dave

+0

@Dave e Oracle JVM. –

+0

Il jetty non funziona all'interno di Android. :( – tse

1

Se non si utilizza Java 6, quindi mi sento di raccomandare Jetty. Funziona molto bene e ha un'interfaccia di programmazione decente.

1

Hai detto "molto leggero" due volte, quindi penso che JLHTTP potrebbe essere una buona partita per te. Puoi incorporarlo come un singolo file sorgente o in un file jar ~ 35K/50K, ma supporta la maggior parte delle funzionalità di cui hai bisogno in un server HTTP.

Disclaimer: I'm the author. Ma guardalo tu stesso e guarda cosa ne pensi :-)

+0

qualcosa del genere esiste per websockets? –

+1

Ho pensato di aggiungere il supporto websocket a JLHTTP, ma è troppo diverso e troppo grande per far parte del core JLHTTP. Forse un giorno andrò in giro a farlo in un progetto fratello separato ... – amichair