Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.
JavaでHTTPサーバを
実装してみた
2017/4/6
準備等
• 準備する内容
• GoogleChrome のインストール
• java8 のインストール
• maven のインストール
• intelliJ のインストール
• https://github.com/YutoEguma/HTTP...
アジェンダ
• 概要
• ServerSocketを使ってみる
• HTTP Request を覗いてみる
• HTTP Response を返してみる
• HTTP Requestに応じてファイルを読み込む
• マルチスレッドにする
概要
今回作成したHTTPサーバの概要
Server
Socket
Socket
HTTP
Request
HTTP
Response
Contents
Loader
Socket
① HTTP リクエストを作成② 通信の
受け口を作成
③リクエスト...
デモ
• webapp/public 以下にコンテンツを配置
• ブラウザからのHTTPリクエストを解析する
• 解析結果によってHTTPレスポンスを返す
• HTML/CSS,Javascript
• PING,JPEG形式の画像
• HTT...
Section1
ServerSocketを使ってみる
• ServerSocketとは「接続を受け付けるもの」
• Socketとは「通信の窓口」
• ServerSocketが接続を受け付けると、サーバとクライ
アント間のやりとりをするためのScketを作成
ServerSocket・Socket
とりあえず書いてみる
今の状態
Server
Socket
Socket
Socket
① HTTP リクエストを作成
② Socket を作成
③リクエストの
読み込み
⑤レスポンスの
書き込み
クライアント
サーバ
ログに出しただけ 適当に文字列を作る
動作確認
• section1/SampleWebServer を起動
• 以下の2つの方法で確認できる
• curlコマンドを実行
• $ curl -i http://localhost:8090
• ブラウザで http://localh...
Section2
HTTP Request を覗いてみる
そもそもHTTPって何?
Hypertext Transfer Protocol(ハイパーテキスト・トランスファー・プロト
コル、略称 HTTP)とは、HTMLなどのコンテンツの送受信に用いられる通
信プロトコルである。主としてWorld Wi...
ざっくりとした仕組み
サーバ クライアント
決められた形式の
リクエストメッセージ
決められた形式の
レスポンスメッセージ
HTTP メッセージの形式
• HTTP メッセージの形式
• Start-line の形式
• request-line の形式
HTTP メッセージの形式
• Header-field
….
いや…
よくわからん!!
実例を見よう(section1でのログ)
GET SP /request-target SP HTTP/1.1 CRLF
Host : OWS localhost:8090 OWS
Connection : OWS keep-alive OWS
リクエストのheader-fieldの種類
• 一例がこちら
• http://www.atmarkit.co.jp/fnetwork/rensai/netpro01/he
ader-fields.html
• 数が多い
• 拡張性があるような...
HTTPRequestクラスを作ってみる
• InputStreamをコンストラクタし文字列を取り出す
• クラスに持つ情報
• request-lineの3つの要素
• header-fieldを(Mapで保持)
• すべてのheader-n...
今の状態
Server
Socket
Socket
HTTP
Request Socket
① HTTP リクエストを作成
② Socket を作成
③リクエストの
読み込み
⑤レスポンスの
書き込み
クライアント
サーバ
適当に文字列を作る
...
Section3
HTTP Response を返してみる
HTTP メッセージの形式 (おさらい + α)
• HTTP メッセージの形式
• Start-line の形式
• status-line の形式
HTTP Status
• Responseの状態を表すもの
• Code と Phrase のペアで管理されてい
• https://triple-underscore.github.io/RFC7231-
ja.html#section-6...
HTTP Response の例
レスポンスのheader-fieldの種類
• 一例がこちら
• http://www.atmarkit.co.jp/fnetwork/rensai/netpro01/he
ader-fields.html
• 数が多い
• HTTPの仕様上 ...
HTTPResponseクラスを実装してみる
• HTTPステータスで初期化する
• クラスに持つ情報
• request-lineの3つの要素
• header-field(Mapで保持)
• すべてのheader-nameを網羅できない
•...
今の状態
Server
Socket
Socket
HTTP
Request
HTTP
Response Socket
① HTTP リクエストを作成
② Socket を作成
③リクエストの
読み込み
⑤レスポンスの
書き込み
クライアント
...
Section4
HTTP Request に応じて
ファイルを読み込む
その前に…
HTTPレスポンスの message-body が
必ず文字列とは限らない!!
コンテンツを文字列で扱うのを諦める…しかない…
コンテンツ系は全部バイナリで扱う
HTTP Response をバイナリにする
• HTTP Response の body をバイト型に
• getResponse をレスポンスをbyte型配列に変換する処
理に変更
• section4-1を参照
ファイル読み込みルールはこんな感じ
• HTTPRequestのrequest-targetのパスにあるものを読み込めば良
い
• 以下の方法ルールで読み込む
• request-targetとファイルの対応
• /hoge/fuga.html...
今の状態
Server
Socket
Socket
HTTP
Request
HTTP
Response
Contents
Loader
Socket
① HTTP リクエストを作成
② Socket を作成
③リクエストの
読み込み
④リクエ...
Section5
マルチスレッドにする
なぜマルチスレッドにするの?
• 処理の高速化のため
• 1回のレスポンスがとても重いとき、全て待たされる
• 多重リクエストを受け付けるため
• section4-2をとんでもなく遅くしてみるデモ
• とてつもなく重いレスポンスを返す処理のあ...
CreateResponseTaskを書いてみる
• socketのスコープを切り出す
• socketができたら、その上での通信の処理は全て各ス
レッドに任せる
• Section5 参照
以上で簡単なHTTPサーバの
実装は終わりです
Upcoming SlideShare
Loading in …5
×
Upcoming SlideShare
What's next for Java API for WebSocket (JSR 356)
Next
Download to read offline and view in fullscreen.

3

Share

Download to read offline

Java8でhttpサーバを実装してみた

Download to read offline

Java8でhttpサーバを実装してみた
2017/04/06 発表

Related Books

Free with a 30 day trial from Scribd

See all

Related Audiobooks

Free with a 30 day trial from Scribd

See all

Java8でhttpサーバを実装してみた

  1. 1. JavaでHTTPサーバを 実装してみた 2017/4/6
  2. 2. 準備等 • 準備する内容 • GoogleChrome のインストール • java8 のインストール • maven のインストール • intelliJ のインストール • https://github.com/YutoEguma/HTTPServerPractice をgit cloneして おく • connpass ページにも記載しています • https://github.com/YutoEguma/HTTPServerPractice/blob/master/RE ADME.md
  3. 3. アジェンダ • 概要 • ServerSocketを使ってみる • HTTP Request を覗いてみる • HTTP Response を返してみる • HTTP Requestに応じてファイルを読み込む • マルチスレッドにする
  4. 4. 概要
  5. 5. 今回作成したHTTPサーバの概要 Server Socket Socket HTTP Request HTTP Response Contents Loader Socket ① HTTP リクエストを作成② 通信の 受け口を作成 ③リクエストの 読み込み ④リクエストの中身を判断して ファイルを読み込む ⑤レスポンスの 書き込み クライアント サーバ
  6. 6. デモ • webapp/public 以下にコンテンツを配置 • ブラウザからのHTTPリクエストを解析する • 解析結果によってHTTPレスポンスを返す • HTML/CSS,Javascript • PING,JPEG形式の画像 • HTTPServerPractice の section5/SampleWebServer を起動
  7. 7. Section1 ServerSocketを使ってみる
  8. 8. • ServerSocketとは「接続を受け付けるもの」 • Socketとは「通信の窓口」 • ServerSocketが接続を受け付けると、サーバとクライ アント間のやりとりをするためのScketを作成 ServerSocket・Socket
  9. 9. とりあえず書いてみる
  10. 10. 今の状態 Server Socket Socket Socket ① HTTP リクエストを作成 ② Socket を作成 ③リクエストの 読み込み ⑤レスポンスの 書き込み クライアント サーバ ログに出しただけ 適当に文字列を作る
  11. 11. 動作確認 • section1/SampleWebServer を起動 • 以下の2つの方法で確認できる • curlコマンドを実行 • $ curl -i http://localhost:8090 • ブラウザで http://localhost:8090 にアクセス
  12. 12. Section2 HTTP Request を覗いてみる
  13. 13. そもそもHTTPって何? Hypertext Transfer Protocol(ハイパーテキスト・トランスファー・プロト コル、略称 HTTP)とは、HTMLなどのコンテンツの送受信に用いられる通 信プロトコルである。主としてWorld Wide Webにおいて、Webブラウザと Webサーバとの間での転送に用いられる。ハイパーテキスト転送プロトコ ルとも呼ばれる。 引用:Wikipedia
  14. 14. ざっくりとした仕組み サーバ クライアント 決められた形式の リクエストメッセージ 決められた形式の レスポンスメッセージ
  15. 15. HTTP メッセージの形式 • HTTP メッセージの形式 • Start-line の形式 • request-line の形式
  16. 16. HTTP メッセージの形式 • Header-field
  17. 17. …. いや… よくわからん!!
  18. 18. 実例を見よう(section1でのログ) GET SP /request-target SP HTTP/1.1 CRLF Host : OWS localhost:8090 OWS Connection : OWS keep-alive OWS
  19. 19. リクエストのheader-fieldの種類 • 一例がこちら • http://www.atmarkit.co.jp/fnetwork/rensai/netpro01/he ader-fields.html • 数が多い • 拡張性があるような仕様になっている • つまり何がくるかわからない
  20. 20. HTTPRequestクラスを作ってみる • InputStreamをコンストラクタし文字列を取り出す • クラスに持つ情報 • request-lineの3つの要素 • header-fieldを(Mapで保持) • すべてのheader-nameを網羅できない
  21. 21. 今の状態 Server Socket Socket HTTP Request Socket ① HTTP リクエストを作成 ② Socket を作成 ③リクエストの 読み込み ⑤レスポンスの 書き込み クライアント サーバ 適当に文字列を作る ログに出しただけ
  22. 22. Section3 HTTP Response を返してみる
  23. 23. HTTP メッセージの形式 (おさらい + α) • HTTP メッセージの形式 • Start-line の形式 • status-line の形式
  24. 24. HTTP Status • Responseの状態を表すもの • Code と Phrase のペアで管理されてい • https://triple-underscore.github.io/RFC7231- ja.html#section-6 HTTP/1.1 SP 200 SP OK CRLF HTTP/1.1 SP 404 SP NOT_FOUND CRLF HTTP/1.1 SP 500 SP OK CRLF
  25. 25. HTTP Response の例
  26. 26. レスポンスのheader-fieldの種類 • 一例がこちら • http://www.atmarkit.co.jp/fnetwork/rensai/netpro01/he ader-fields.html • 数が多い • HTTPの仕様上 拡張性があるような仕様になっている • つまりその時々で書き出す情報が異なる
  27. 27. HTTPResponseクラスを実装してみる • HTTPステータスで初期化する • クラスに持つ情報 • request-lineの3つの要素 • header-field(Mapで保持) • すべてのheader-nameを網羅できない • content-type, content-length をとりあえず入れる • コンテンツ(message-body)
  28. 28. 今の状態 Server Socket Socket HTTP Request HTTP Response Socket ① HTTP リクエストを作成 ② Socket を作成 ③リクエストの 読み込み ⑤レスポンスの 書き込み クライアント サーバ ログに出しただけ 適当に作っただけ
  29. 29. Section4 HTTP Request に応じて ファイルを読み込む
  30. 30. その前に… HTTPレスポンスの message-body が 必ず文字列とは限らない!! コンテンツを文字列で扱うのを諦める…しかない… コンテンツ系は全部バイナリで扱う
  31. 31. HTTP Response をバイナリにする • HTTP Response の body をバイト型に • getResponse をレスポンスをbyte型配列に変換する処 理に変更 • section4-1を参照
  32. 32. ファイル読み込みルールはこんな感じ • HTTPRequestのrequest-targetのパスにあるものを読み込めば良 い • 以下の方法ルールで読み込む • request-targetとファイルの対応 • /hoge/fuga.html • Project/src/main/resources/public/hoge/fuga.html • request-targetに拡張子の指定がなければディレクトリとみな し、index.htmlを探す • Section4-2 参照
  33. 33. 今の状態 Server Socket Socket HTTP Request HTTP Response Contents Loader Socket ① HTTP リクエストを作成 ② Socket を作成 ③リクエストの 読み込み ④リクエストの中身を判断して ファイルを読み込む ⑤レスポンスの 書き込み クライアント サーバ
  34. 34. Section5 マルチスレッドにする
  35. 35. なぜマルチスレッドにするの? • 処理の高速化のため • 1回のレスポンスがとても重いとき、全て待たされる • 多重リクエストを受け付けるため • section4-2をとんでもなく遅くしてみるデモ • とてつもなく重いレスポンスを返す処理のあとに、 軽い接続があった時にどうなるのか?
  36. 36. CreateResponseTaskを書いてみる • socketのスコープを切り出す • socketができたら、その上での通信の処理は全て各ス レッドに任せる • Section5 参照
  37. 37. 以上で簡単なHTTPサーバの 実装は終わりです
  • HideyukiYabe

    Nov. 20, 2017
  • YukiKikuya

    Nov. 13, 2017
  • Tadasihasimoto

    Apr. 10, 2017

Java8でhttpサーバを実装してみた 2017/04/06 発表

Views

Total views

3,011

On Slideshare

0

From embeds

0

Number of embeds

609

Actions

Downloads

15

Shares

0

Comments

0

Likes

3

×