2009-11-08 7 views
3

Existe-t-il un objet dans le SE Java standard pouvant accepter une requête HTTP depuis un socket? J'ai trouvé comment créer et envoyer un, mais je n'ai pas trouvé un moyen de récupérer un objet HTTP à partir d'un socket. Je peux en créer un moi-même, mais je préfère me fier à un objet lourdement testé.Objet de requête HTTP

Cela semble être quelque chose qui serait facilement disponible compte tenu de la structure de JSP.

Répondre

4

Il existe un petit serveur HTTP dans Java 6 SDK (pas sûr que ce soit dans le JRE ou dans les JVM non-Sun).

De http://www.java2s.com/Code/Java/JDK-6/LightweightHTTPServer.htm:

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

Cela ressemble beaucoup à ce que je cherchais. – monksy

+0

Si vous ne maîtrisez pas très bien l'emplacement de votre logiciel, je vous déconseille vivement d'utiliser des fonctionnalités propriétaires dans la machine virtuelle Sun, du moins lorsqu'il existe des alternatives facilement disponibles. Vous pouvez à la place utiliser Jetty comme un conteneur de servlet intégrable, ce qui vous fournirait une solution portable pour votre question. – jarnbjo

+0

@jarnbjo, vrai, mais ce n'est pas une classe Sun interne. Voir http://java.sun.com/javase/6/docs/jre/api/net/httpserver/spec/index.html?com/sun/net/httpserver/HttpServer.html –

1

On dirait que vous recherchez une servlet. Une servlet est une API qui vous permet de recevoir et de répondre à une requête HTTP.

Votre servlet est déployée dans un conteneur, qui est essentiellement le serveur Web réel qui prendra en charge toutes les complexités du protocole. (Les plus populaires sont Tomcat et Jetty)

+0

Ce n'est pas ce que je cherchais. J'écris un serveur HTTP, et je voudrais voir s'il y avait des classes existantes qui géreraient l'analyse des requêtes HTTP. – monksy

2

Ouais, vous faites un nouvel objet requête HTTP de ce que vous acceptez sur la prise. Ce que vous faites après cela dépend de vous, mais cela devrait probablement impliquer une réponse HTTP.

import java.io.*; 
import java.net.*; 
import java.util.*; 

public final class WebServer { 
    public static void main(String args[]) throws Exception { 
     int PORT = 8080; 
     ServerSocket listenSocket = new ServerSocket(PORT); 
     while(true) { 
      HttpRequest request = new HttpRequest(listenSocket.accept()); 
      Thread thread = new Thread(request); 
      thread.start(); 
     } 
    } 
} 

De: http://www.devhood.com/tutorials/tutorial_details.aspx?tutorial_id=396
Il y a encore du travail à faire dans le tutoriel, mais il ne semble agréable.