2009-07-27 17 views
31

非常に軽いHTTPサーバーを、リクエストを受け入れ、いくつかのアクションを実行して結果を返すJavaスイングアプリに埋め込みたいと考えています。Swing Javaアプリケーションに埋め込まれたHTTPサーバー

私のアプリケーションで使用できる、非常に軽いJavaクラスがあります。これは、指定されたポートでHTTPリクエストを受信し、リクエストを処理できますか?

私はスタンドアロンのhttpサーバを探しているわけではないことに注意してください。私のJavaアプリケーションで使用できる小さなJavaクラスです。

答えて

67

を使用することができます驚くべきことに、日JDKはすでに(のみJDK 6から始まる)シンプルなHTTPサーバの実装が含まれています。 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(); 
    } 
    } 
} 

それとも、その目的のためにJettyを使用することができます参照してください。かなり軽量で、この目的に完全に合っています。

+3

余分なマイルに行き、サンプルコードを提供していただきありがとうございます。これは私の必要性に応えて歓迎します – CodeAndCats

+0

この例に関連する他の質問が1つありますか?たとえば、クライアントが閉じるように指示する特別なURLを要求した場合、server.stop(0)を呼び出してサーバーを停止できますが、アプリケーション自体はまだ存在するようです実行中ですか? – CodeAndCats

+0

@Ivan - ハンドルメソッドからの警告メッセージでリンク先にリダイレクトする方法はありますか?ありがとうございます – JHS

8

jettyは、かなり軽量な組み込みサーバーとして使用できます。その他のオプションは、HTTPリクエストhttp://java.sun.com/developer/technicalArticles/Networking/Webserver/を処理するための単純なJavaクラスを調べることです。

他の方法は、Java 6であるあなたはcom.sun.net.httpserver.HttpServer

+0

Java 6のプラトフォームにアプリケーションをデプロイする場合、Java 6 Webサーバーが最適です。 – Dave

+0

@DaveとOracle JVM。 –

+0

JettyはAndroidの中では動作しません。 : – tse

1

Java 6を使用していない場合は、確かにJettyをお勧めします。それは非常にうまく動作し、まともなプログラミングインターフェイスを持っています。

1

で非常に良いJDKあなたは「非常に軽い」と二度言ったので、JLHTTPはあなたによくマッチするかもしれません。単一のソースファイルまたは〜35K/50Kのjarファイルとして埋め込むことができますが、必要なほとんどの機能を、そのままのHTTPサーバーでサポートします。

免責事項:私は著者です。しかしあなた自身でそれをチェックし、あなたの考えを見てください:-)

+0

WebSocketのようなもの? –

+1

JLHTTPにwebsocketサポートを追加することを検討しましたが、コアJLHTTPの一部となるには大きすぎて大きすぎます。多分私は別の兄弟プロジェクトでそれをやっていくつもりです。 – amichair

関連する問題