Java SE API のみを使用した Java のシンプルな HTTP サーバー 質問する

Java SE API のみを使用した Java のシンプルな HTTP サーバー 質問する

HTTP リクエストを手動で解析し、HTTP 応答を手動でフォーマットするコードを記述せずに、Java SE API だけを使用して Java で非常に基本的な HTTP サーバー (GET/POST のみをサポート) を作成する方法はありますか? Java SE API は HTTP クライアント機能を にうまくカプセル化していますHttpURLConnectionが、HTTP サーバー機能に相当するものはありますか?

明確にしておくと、私がオンラインで見た多くの例で問題ServerSocketなのは、独自のリクエスト解析/応答フォーマットとエラー処理を行っていることです。これは面倒で、エラーが発生しやすく、包括的ではない可能性が高いため、私はこれらの理由からそれを避けようとしています。

ベストアンサー1

Java SE 6以降、 Sun Oracle JREにはHTTPサーバーが組み込まれています 。Java 9のモジュール名はjdk.httpservercom.sun.net.httpserverパッケージの概要関連するクラスの概要と例を示します。

彼らのドキュメントからコピーペーストしたキックオフの例を次に示します。Java 6+ でコピー&ペーストして実行できます。
(それでもなお編集しようとしているすべての人へ。これは醜いコードなので、やめてください。これはコピーペーストであり、私のものではありません。また、元のソースで変更されていない限り、引用を編集しないでください)

package com.stackoverflow.q3732109;

import java.io.IOException;
import java.io.OutputStream;
import java.net.InetSocketAddress;

import com.sun.net.httpserver.HttpExchange;
import com.sun.net.httpserver.HttpHandler;
import com.sun.net.httpserver.HttpServer;

public class Test {

    public static void main(String[] args) throws Exception {
        HttpServer server = HttpServer.create(new InetSocketAddress(8000), 0);
        server.createContext("/test", new MyHandler());
        server.setExecutor(null); // creates a default executor
        server.start();
    }

    static class MyHandler implements HttpHandler {
        @Override
        public void handle(HttpExchange t) throws IOException {
            String response = "This is the response";
            t.sendResponseHeaders(200, response.length());
            OutputStream os = t.getResponseBody();
            os.write(response.getBytes());
            os.close();
        }
    }

}

注目すべきは、response.length()彼らの例の の部分が間違っているということです。 であるべきでしたresponse.getBytes().length。 それでも、getBytes()メソッドは明示的に文字セットを指定する必要があります。その後、それを応答ヘッダーで指定します。 残念ながら、初心者には誤解を招くかもしれませんが、結局のところ、これは基本的なキックオフ例にすぎません。

これを実行して http://localhost:8000/test にアクセスすると、次の応答が表示されます。

これがその答えだ


クラスの使用に関してはcom.sun.*、一部の開発者が考えているのとは反対に、よく知られているFAQでは絶対に禁止されていないことに注意してください。開発者が「sun」パッケージを呼び出すプログラムを書いてはいけない理由その FAQ は、パッケージではなく、Oracle JRE による内部使用のためのsun.*パッケージ (など) に関するものです (そのため、別の JRE でアプリケーションを実行すると、アプリケーションが強制終了されます) 。Sun/Oracle も、Apache などの他の企業と同様に、Java SE API 上でソフトウェアを開発しています。さらに、この特定のパッケージはすべての JDK に存在する必要があるため、パッケージで発生するような「移植性」の問題はまったく発生しません。クラスの使用は、GlassFish (Java EE 実装)、Mojarra (JSF 実装)、Jersey (JAX-RS 実装) などの特定の Java API の実装に関する場合にのみ推奨されません (ただし、禁止されていません)。sun.misc.BASE64Encodercom.sun.*HttpServersun.*com.sun.*

おすすめ記事