最も単純なJava Webサーバーを記述することによるHTTPプロトコルの最初の紹介

HTTPプロトコルの本質についての知識と理解は、現代のWeb開発の分野のいずれかに真剣に取り組むことを決めた人に必要だと言っても過言ではないと思います。 私の個人的な経験から、理解はすぐには得られないことが示唆されています。 GETとPOSTという言葉が私にとって魔法の呪文に似ていることがあり、PUT、PATCH、DELETEの存在を疑うことさえなかったと言うのは恥ずかしいことです。



数ヶ月前、開発そのものに加えて、私も教え始めました。そして、将来のJava開発者にHTTPプロトコルの本質を伝えるのがいかに簡単で明確かという疑問が生じました。 数日間の大騒ぎと一連のプレゼンテーションの試みが失敗した後、Javaで簡単なHTTPサーバーを作成してみませんか。アイデアのプロトコルは、プロトコルの本質だけでなく、最もシンプルだが機能する実装を説明しません。



結局のところ、これはまったく難しくありません。 以下は、ブラウザとの正しい相互作用に十分なコードです! 必要なのは、ServerSocketといくつかの標準I / Oだけです。



import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintWriter; import java.net.ServerSocket; import java.net.Socket; import java.nio.charset.StandardCharsets; public class HttpServer { public static void main(String[] args) { try (ServerSocket serverSocket = new ServerSocket(8080)) { System.out.println("Server started!"); while (true) { //   Socket socket = serverSocket.accept(); System.out.println("Client connected!"); //      //    try (BufferedReader input = new BufferedReader(new InputStreamReader(socket.getInputStream(), StandardCharsets.UTF_8)); PrintWriter output = new PrintWriter(socket.getOutputStream())) { //     while (!input.ready()) ; //         System.out.println(); while (input.ready()) { System.out.println(input.readLine()); } //   output.println("HTTP/1.1 200 OK"); output.println("Content-Type: text/html; charset=utf-8"); output.println(); output.println("<p> !</p>"); output.flush(); //     try-with-resources , //         System.out.println("Client disconnected!"); } } } catch (IOException ex) { ex.printStackTrace(); } } }
      
      





このコードを実行してみてください。 ServerSocketが作成されるポートは空いている必要があることに注意してください。 指定されたポートがビジーの場合、ポートを解放するか、別の空きポートを使用する必要があります。



このコードを実行した後、ブラウザーウィンドウに移動し、アドレスバーにhttp://localhost:8080/



ます。 すべてがうまくいった場合、ブラウザウィンドウに「Hello everybody」というテキストが表示され、サーバーログテキストに次のようなテキストが表示されます。



 Server started! Client connected! GET / HTTP/1.1 Host: localhost:8080 Connection: keep-alive Cache-Control: max-age=0 Upgrade-Insecure-Requests: 1 User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.109 Safari/537.36 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8 Accept-Encoding: gzip, deflate, br Accept-Language: ru-RU,ru;q=0.9,en-US;q=0.8,en;q=0.7,he;q=0.6,de;q=0.5,cs;q=0.4 Cookie: _ga=GA1.1.1849608036.1549463927; portainer.pagination_containers=100; _gid=GA1.1.80775985.1550669456; If-Modified-Since: Sat, 05 Jan 2019 12:10:16 GMT Client disconnected!
      
      





ブラウザーのアドレスバーに何かを入力してEnterキーを押すたびに、GETという単語で始まり、改行で終わるテキストを送信する以外に何も起こりません。 GETという単語の後に、サーバー上の要求されたドキュメントへのパスの後にスペースが続きます。 http://localhost:8080/something



をブラウザに入力して、ログのリクエストテキストがどのように変化するかを確認してください。



クエリ行では、2番目からは、いわゆる クライアント設定に関する情報をサーバーに送信するためのヘッダー。 各ヘッダー行の形式は[ ] : []; []; ... []



[ ] : []; []; ... []



[ ] : []; []; ... []







サーバーが要求テキストを完全に読み取った後、最も単純な応答を送信します。その構造は非常に単純で、要求の構造に似ています。 最初の行には、HTTPプロトコルバージョンと200 OKコードが含まれ、リクエストが正常に処理されたことをブラウザーに通知します(誰もが404コードをよく知っています;))。 この後には、送信されるドキュメントの形式(テキスト/ html)とそのエンコード(charset = utf-8)で情報が送信されるContent-Typeヘッダーが1つだけ続きます。 ヘッダーが改行(HTTPプロトコルの必須要件)であり、ブラウザーに表示される実際のテキストの後。



それだけです! もちろん、これはHTTPプロトコルとWebサーバー開発の原則について知る必要があるすべてからはほど遠いですが、この例を複雑にしたくはありません。 彼の主な仕事は、HTTPプロトコルを介した最も単純な通信を実証することです。 私の次の記事の1つで、その実装を通じてHTTPプロトコルを研究するトピックの開発を試みます。



UPD。 このようなサーバーのより高度な例は、 Tomcatの仕組み:独自のJavaサーブレットコンテナの開発ガイド、Paul Deck、Budi Kurniawanの第1章-Simple Web Serverにあります



All Articles