views:

1650

answers:

3

I wish to embed a very light HTTP server in my java swing app which just accepts requests, performs some actions and returns the results.

Is there a very light java class that I can use in my app which listens on a specified port for Http requests and lets me handle requests?

Note that I am not looking for a stand-alone http server, just a small java class which I can use in my java app.

+4  A: 

You can use jetty as embedded server, its fairly light weight. Other option is check this out for a simple java class to handle http requests http://java.sun.com/developer/technicalArticles/Networking/Webserver/.

Other way is in Java 6 you can use com.sun.net.httpserver.HttpServer

Bhushan
The Java 6 web server is your best bet if your app is deployed on platoforms with Java 6.
Dave
+8  A: 

Surprisingly, Sun JDK already contains a simple http server implementation (only starting from the JDK 6). See 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();
    }
  }
}

Or you can use Jetty for that purpose. It’s quite lightweight and perfectly fits this purpose.

Ivan Dubrov
Thanks for going the extra mile and providing example code. This should be perfect for my needs, cheers!
Ben Daniel
Sorry may I ask you one other question related to this example? Running this example, once the server is started I'm not sure how the heck to stop the thread it's running on? For example, if a client requests a special url which tells it to close, I can stop the server by calling server.stop(0) but the app itself seems to still be running?
Ben Daniel
A: 

If you're not using Java 6, then I would certainly recommend Jetty. That works very well and has a decent programming interface.

Brian Agnew