2009-07-27 8 views
31

Je souhaite intégrer un serveur HTTP très léger dans mon application java swing qui n'accepte que les requêtes, effectue certaines actions et renvoie les résultats.Serveur HTTP intégré dans l'application Swing Java

Y a-t-il une classe java très légère que je peux utiliser dans mon application qui écoute sur un port spécifié pour les requêtes Http et qui me permet de gérer les requêtes?

Notez que je ne recherche pas un serveur http autonome, juste une petite classe java que je peux utiliser dans mon application java.

Répondre

67

Étonnamment, Sun JDK contient déjà une implémentation simple du serveur http (uniquement à partir du JDK 6). Voir 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(); 
    } 
    } 
} 

Ou vous pouvez utiliser Jetty à cette fin. C'est assez léger et correspond parfaitement à cet objectif.

+3

Merci d'avoir fait un effort supplémentaire et de fournir un exemple de code, ce qui devrait être parfait pour mes besoins, bravo! – CodeAndCats

+0

Je peux vous poser une autre question concernant cet exemple? Par exemple, si un client demande une URL spéciale qui lui dit de se fermer, je peux arrêter le serveur en appelant server.stop (0) mais l'application elle-même semble toujours être – CodeAndCats

+0

@Ivan - Pouvez-vous me dire comment rediriger vers un lien avec un message d'alerte de la méthode du handle? Merci – JHS

8

Vous pouvez utiliser la jetée comme serveur intégré, c'est assez léger. L'autre option est de vérifier ceci pour une classe Java simple pour gérer les requêtes http http://java.sun.com/developer/technicalArticles/Networking/Webserver/.

Autre moyen est en Java 6, vous pouvez utiliser com.sun.net.httpserver.HttpServer

+0

Le serveur Web Java 6 est votre meilleur choix si votre application est déployée sur des platformes avec Java 6. – Dave

+0

@Dave et la JVM Oracle. –

+0

Jetty ne fonctionne pas dans l'Android. :( – tse

1

Si vous n'utilisez pas Java 6, alors je recommanderais certainement Jetty. Cela fonctionne très bien et a une interface de programmation décente.

1

Vous avez dit "très léger" deux fois, donc je pense que JLHTTP pourrait être un bon match pour vous. Vous pouvez l'intégrer en tant que fichier source unique ou fichier jar ~ 35K/50K, mais il prend en charge la plupart des fonctionnalités dont vous avez besoin dans un serveur HTTP prêt à l'emploi.

Avis de non-responsabilité: Je suis l'auteur. Mais vérifiez par vous-même et voyez ce que vous en pensez :-)

+0

quelque chose comme ça existe pour les websockets? –

+1

J'ai envisagé d'ajouter le support websocket à JLHTTP, mais il est trop différent et trop grand pour faire partie du core JLHTTP. Peut-être qu'un jour je vais me débrouiller pour le faire dans un projet de fraternité séparé ... – amichair