Code Monkey home page Code Monkey logo

simplehttpjavaserver's People

Watchers

RyoheiYamamoto avatar

simplehttpjavaserver's Issues

STEP1. ネットワークプログラミング関連のパッケージを見つけよう!

  • STEP1ブランチを作成してcheckoutする
  • RFCやJavaDocなどを調査し、HTTPサーバー実装に使いそうなパッケージを見つける。SimpleJavaHTTPServer.java内にコメントでパッケージ名をメモする(1つでOK)
  • push & commitし、Pull Requestを作る
  • PRビルドが通ることを確認し、Assigneesにレビュワーを指定してレビューを依頼する

STEP7. HTMLファイルを返せるようにしよう!!

  • STEP7 ブランチを切る
  • index.html を読み込んだレスポンスを生成して、返す
  • curlコマンドを叩いて、ボディのみが返ってくることを確認
  • ブラウザからアクセスして、作成したHTMLが表示されていることを確認
  • push & commitし、Pull Requestを作る
  • PRビルドが通ることを確認し、Assigneesにレビュワーを指定してレビューを依頼する

STEP2. サーバーが立ち上がるようにしよう!

サーバーが立ち上がる = サーバーソケットに指定したホストとポートを割り当て、接続を待ち受ける状態。

  • STEP2ブランチを作成する
  • Javaでサーバーソケットを作成する方法を調べる
  • 作成したサーバーソケットにホストとポートを割り当てる(= バインドする)方法を調べる
  • サーバーソケットを作成し、ホストとポートを割り当てるところまでコードを書いてみる
  • 割り当てができたら、コンソールにserving HTTP on localhost port 8000 ...と出力されるようにする
  • サーバーソケットがリクエストを待機するようコードを書いてみる
  • リクエストが来たら、コンソールにHello Request!と出力されるようにする
  • push & commitし、Pull Requestを作る
  • PRビルドが通ることを確認し、Assigneesにレビュワーを指定してレビューを依頼する

STEP11. ファイルの最終更新時刻を元に、レスポンスヘッダにLast-Modifiedをつけて返せるようにしよう!

  • STEP11ブランチを切る
  • 読み込んだファイルの、最終更新日時を取得し、コンソールに出力してみる
  • レスポンスを返す際に、Last-Modifiedをヘッダーに追加し、上記で取得した最終更新日時を返すようにしてみる
  • ブラウザ等で、Last-Modifiedがレスポンスに存在することを確認
  • push & commitし、Pull Requestを作る
  • PRビルドが通ることを確認し、Assigneesにレビュワーを指定してレビューを依頼する

STEP3. 「Hello Client!」と返ってくるようにしよう!

  • STEP3ブランチを作成する
  • ServerSocket#accept()メソッドが返すのはSocketオブジェクト。java.netパッケージおよびSocketクラスのJavadocを熟読し、クライアントにデータを返す方法を検討する
  • Hello Client!という文字列をバイト列に変換する方法を調べる
  • クライアントに「Hello Client!」と返すようにコードを書いてみる
  • サーバーを起動して、動作を確認する
  • ブラウザでリロードをしても「Hello Client!」と表示されるようにコードを修正する
  • push & commitし、Pull Requestを作る
  • PRビルドが通ることを確認し、Assigneesにレビュワーを指定してレビューを依頼する

STEP5. レスポンスにそれっぽいHTTPヘッダを付けてみよう!

  • STEP5 ブランチを切る
  • RFCを読んで、HTTPヘッダについて調べる
  • HTTPヘッダに Date を追加する
  • ボディにSTEP3と同じ内容をセットしたレスポンスを生成して、返す
  • curlコマンドを叩いて、ボディのみ返ってくることを確認
  • push & commitし、Pull Requestを作る
  • PRビルドが通ることを確認し、Assigneesにレビュワーを指定してレビューを依頼する

STEP6. GETリクエストが来たらハードコードしたHTMLを返すようにしよう!

  • STEP6 ブランチを切る
  • RFCを読んで、HTMLを返す際に必要なHTTPヘッダを選ぶ
  • ハードコードで<h1>こんにちは、くらいあんと!</h1>をhtmlとしてブラウザに返して、正しく表示されることを確認
  • ブラウザからアクセスして、想定したレスポンスが返ってくることを確認
  • push & commitし、Pull Requestを作る
  • PRビルドが通ることを確認し、Assigneesにレビュワーを指定してレビューを依頼する

STEP4. curlで投げたリクエストがそのまま返ってくるようにしてみよう!

  • STEP4ブランチを作成する
  • HTTPリクエストを末尾までreadし、コンソールにprintlnする
  • サーバーを起動し、curlでGETリクエストを行い、コンソールにHTTPリクエストが文字列として表示されることを確認する
  • クライアントにHTTPリクエストをそのまま返すようにコードを書いてみる
  • サーバーを再起動し、動作を確認する
  • push & commitし、Pull Requestを作る
  • PRビルドが通ることを確認し、Assigneesにレビュワーを指定してレビューを依頼する

STEP9. 画像を返せるようにしよう!

  • STEP9 のブランチを切る
  • 文字列ではなくバイナリでファイルを読み込むようにコードを修正する(すでになっていればOK)
  • 文字列ではなくバイナリでファイルをレスポンスに渡すようにコードを修正する(すでになっていればOK)
  • ブラウザで画像が表示でできることを確認
  • htmlのimgタグでも画像が表示できることを確認
<img src="sample.png" alt="サンプル画像" />
  • cssで画像を指定しても表示できることを確認
.class-name {
    background-image: url('sample.png');
}
  • push & commitし、Pull Requestを作る
  • PRビルドが通ることを確認し、Assigneesにレビュワーを指定してレビューを依頼する

STEP10. マルチスレッドにしてみよう!

  • STEP10 のブランチを切る
  • 以下の手順で現在の状態だと4の処理が重くなることを確認する、確認後コードは戻すこと
  1. pdf ファイルの読み込みに10秒かかるようにする
  2. ブラウザで普通にhtmlファイルにアクセスし、すぐにレスポンスが返ってくる
  3. ブラウザで、pdfファイルにアクセスしてみる
  4. 10秒以内に別タブでhtmlファイルにアクセスすると、レスポンスがすぐに返ってこない
  • mainメソッドから「リクエストの読み込みから、レスポンスの書き込みまでの処理」をメソッドに切り出す
  • 切り出した部分を並列で同時に実行できるようにする
  • 以下の手順でマルチスレッド化すると4の処理が軽くなることを確認する、確認後コードは戻すこと
  1. pdf ファイルの読み込みに10秒かかるようにする
  2. ブラウザで普通にhtmlファイルにアクセスし、すぐにレスポンスが返ってくる
  3. ブラウザで、pdfファイルにアクセスしてみる
  4. 10秒以内に別タブでhtmlファイルにアクセスすると、レスポンスがすぐに返ってくる
  • push & commitし、Pull Requestを作る
  • PRビルドが通ることを確認し、Assigneesにレビュワーを指定してレビューを依頼する

STEP8. URLに応じたテキストファイルを返せるようにしよう!

  • STEP8 のブランチを切る
  • HTTPリクエストから、どのコンテンツを指定されているのかをコンソールに出してみる
  • 以下のルールでファイルを読み込み、レスポンスを返す
  • src/main/resources/public の下にあるファイルを読み込む
  • 拡張子が付いていれば、そのファイルを読み込む
    • ファイルが存在すればそれをbodyに持つレスポンスを返す
    • ファイル存在しなければ、存在しない旨を伝えるレスポンスを返す
  • 拡張子がついていなければ、ディレクトリとして読み込む
    • ディレクトリが存在し、その中にindex.htmlがあればそれを読み込み、レスポンスを返す
    • ディレクトリが存在し、その中にindex.htmlがなければ、その中のファイルのリストを表示させるレスポンスにして返す
    • ディレクトリが存在しなければ、存在しない旨を伝えるレスポンスを返す
  • 読み込んだファイルに応じた、content-typeとcontent-lengthをヘッダーフィールドに付与する
  • ブラウザで問題なく表示されることを確認する
  • push & commitし、Pull Requestを作る
  • PRビルドが通ることを確認し、Assigneesにレビュワーを指定してレビューを依頼する

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.