SlideShare une entreprise Scribd logo
1  sur  37
JavaでHTTPサーバを
実装してみた
2017/4/6
準備等
• 準備する内容
• GoogleChrome のインストール
• java8 のインストール
• maven のインストール
• intelliJ のインストール
• https://github.com/YutoEguma/HTTPServerPractice をgit cloneして
おく
• connpass ページにも記載しています
• https://github.com/YutoEguma/HTTPServerPractice/blob/master/RE
ADME.md
アジェンダ
• 概要
• 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形式の画像
• HTTPServerPractice の section5/SampleWebServer
を起動
Section1
ServerSocketを使ってみる
• ServerSocketとは「接続を受け付けるもの」
• Socketとは「通信の窓口」
• ServerSocketが接続を受け付けると、サーバとクライ
アント間のやりとりをするためのScketを作成
ServerSocket・Socket
とりあえず書いてみる
今の状態
Server
Socket
Socket
Socket
① HTTP リクエストを作成
② Socket を作成
③リクエストの
読み込み
⑤レスポンスの
書き込み
クライアント
サーバ
ログに出しただけ 適当に文字列を作る
動作確認
• section1/SampleWebServer を起動
• 以下の2つの方法で確認できる
• curlコマンドを実行
• $ curl -i http://localhost:8090
• ブラウザで http://localhost:8090 にアクセス
Section2
HTTP Request を覗いてみる
そもそもHTTPって何?
Hypertext Transfer Protocol(ハイパーテキスト・トランスファー・プロト
コル、略称 HTTP)とは、HTMLなどのコンテンツの送受信に用いられる通
信プロトコルである。主としてWorld Wide Webにおいて、Webブラウザと
Webサーバとの間での転送に用いられる。ハイパーテキスト転送プロトコ
ルとも呼ばれる。
引用:Wikipedia
ざっくりとした仕組み
サーバ クライアント
決められた形式の
リクエストメッセージ
決められた形式の
レスポンスメッセージ
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-nameを網羅できない
今の状態
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/1.1 SP 200 SP OK CRLF
HTTP/1.1 SP 404 SP NOT_FOUND CRLF
HTTP/1.1 SP 500 SP OK CRLF
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を網羅できない
• content-type, content-length をとりあえず入れる
• コンテンツ(message-body)
今の状態
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
• Project/src/main/resources/public/hoge/fuga.html
• request-targetに拡張子の指定がなければディレクトリとみな
し、index.htmlを探す
• Section4-2 参照
今の状態
Server
Socket
Socket
HTTP
Request
HTTP
Response
Contents
Loader
Socket
① HTTP リクエストを作成
② Socket を作成
③リクエストの
読み込み
④リクエストの中身を判断して
ファイルを読み込む
⑤レスポンスの
書き込み
クライアント
サーバ
Section5
マルチスレッドにする
なぜマルチスレッドにするの?
• 処理の高速化のため
• 1回のレスポンスがとても重いとき、全て待たされる
• 多重リクエストを受け付けるため
• section4-2をとんでもなく遅くしてみるデモ
• とてつもなく重いレスポンスを返す処理のあとに、
軽い接続があった時にどうなるのか?
CreateResponseTaskを書いてみる
• socketのスコープを切り出す
• socketができたら、その上での通信の処理は全て各ス
レッドに任せる
• Section5 参照
以上で簡単なHTTPサーバの
実装は終わりです

Contenu connexe

Tendances

2 TomcatによるWebアプリケーションサーバ構築 第2章 Tomcat概要(2)-セッション
2 TomcatによるWebアプリケーションサーバ構築 第2章 Tomcat概要(2)-セッション2 TomcatによるWebアプリケーションサーバ構築 第2章 Tomcat概要(2)-セッション
2 TomcatによるWebアプリケーションサーバ構築 第2章 Tomcat概要(2)-セッション
Enpel
 

Tendances (20)

OpenStack Best Practices and Considerations - terasky tech day
OpenStack Best Practices and Considerations  - terasky tech dayOpenStack Best Practices and Considerations  - terasky tech day
OpenStack Best Practices and Considerations - terasky tech day
 
ZOZOTOWNのアーキテクトという役割を紹介します
ZOZOTOWNのアーキテクトという役割を紹介しますZOZOTOWNのアーキテクトという役割を紹介します
ZOZOTOWNのアーキテクトという役割を紹介します
 
忙しい人の5分で分かるMesos入門 - Mesos って何だ?
忙しい人の5分で分かるMesos入門 - Mesos って何だ?忙しい人の5分で分かるMesos入門 - Mesos って何だ?
忙しい人の5分で分かるMesos入門 - Mesos って何だ?
 
Azureの学習にオススメな動画コンテンツまとめ.pptx
Azureの学習にオススメな動画コンテンツまとめ.pptxAzureの学習にオススメな動画コンテンツまとめ.pptx
Azureの学習にオススメな動画コンテンツまとめ.pptx
 
MySQL InnoDB Clusterによる高可用性構成(DB Tech Showcase 2017)
MySQL InnoDB Clusterによる高可用性構成(DB Tech Showcase 2017)MySQL InnoDB Clusterによる高可用性構成(DB Tech Showcase 2017)
MySQL InnoDB Clusterによる高可用性構成(DB Tech Showcase 2017)
 
速習!論理レプリケーション ~基礎から最新動向まで~(PostgreSQL Conference Japan 2022 発表資料)
速習!論理レプリケーション ~基礎から最新動向まで~(PostgreSQL Conference Japan 2022 発表資料)速習!論理レプリケーション ~基礎から最新動向まで~(PostgreSQL Conference Japan 2022 発表資料)
速習!論理レプリケーション ~基礎から最新動向まで~(PostgreSQL Conference Japan 2022 発表資料)
 
Windows PowerShell によるWindows Server 管理の自動化 v4.0 2014.03.13 更新版
Windows PowerShell によるWindows Server 管理の自動化 v4.0 2014.03.13 更新版Windows PowerShell によるWindows Server 管理の自動化 v4.0 2014.03.13 更新版
Windows PowerShell によるWindows Server 管理の自動化 v4.0 2014.03.13 更新版
 
20191120 AWS Black Belt Online Seminar Amazon Managed Streaming for Apache Ka...
20191120 AWS Black Belt Online Seminar Amazon Managed Streaming for Apache Ka...20191120 AWS Black Belt Online Seminar Amazon Managed Streaming for Apache Ka...
20191120 AWS Black Belt Online Seminar Amazon Managed Streaming for Apache Ka...
 
ウェブ・セキュリティ基礎試験(徳丸基礎試験)の模擬試験問題
ウェブ・セキュリティ基礎試験(徳丸基礎試験)の模擬試験問題ウェブ・セキュリティ基礎試験(徳丸基礎試験)の模擬試験問題
ウェブ・セキュリティ基礎試験(徳丸基礎試験)の模擬試験問題
 
Presto on YARNの導入・運用
Presto on YARNの導入・運用Presto on YARNの導入・運用
Presto on YARNの導入・運用
 
AWS Black Belt Online Seminar 2017 Amazon VPC
AWS Black Belt Online Seminar 2017 Amazon VPCAWS Black Belt Online Seminar 2017 Amazon VPC
AWS Black Belt Online Seminar 2017 Amazon VPC
 
Dockerからcontainerdへの移行
Dockerからcontainerdへの移行Dockerからcontainerdへの移行
Dockerからcontainerdへの移行
 
Prophecyを使ったユニットテスト
Prophecyを使ったユニットテスト Prophecyを使ったユニットテスト
Prophecyを使ったユニットテスト
 
SolrとElasticsearchを比べてみよう
SolrとElasticsearchを比べてみようSolrとElasticsearchを比べてみよう
SolrとElasticsearchを比べてみよう
 
2 TomcatによるWebアプリケーションサーバ構築 第2章 Tomcat概要(2)-セッション
2 TomcatによるWebアプリケーションサーバ構築 第2章 Tomcat概要(2)-セッション2 TomcatによるWebアプリケーションサーバ構築 第2章 Tomcat概要(2)-セッション
2 TomcatによるWebアプリケーションサーバ構築 第2章 Tomcat概要(2)-セッション
 
AWS Systems manager 入門
AWS Systems manager 入門AWS Systems manager 入門
AWS Systems manager 入門
 
Azure Cosmos DB の整合性レベルについて
Azure Cosmos DB の整合性レベルについてAzure Cosmos DB の整合性レベルについて
Azure Cosmos DB の整合性レベルについて
 
C#の強み、或いは何故PHPから乗り換えるのか
C#の強み、或いは何故PHPから乗り換えるのかC#の強み、或いは何故PHPから乗り換えるのか
C#の強み、或いは何故PHPから乗り換えるのか
 
20171005 告白に学ぶ http status code
20171005 告白に学ぶ http status code20171005 告白に学ぶ http status code
20171005 告白に学ぶ http status code
 
IT Pro のための PowerShell スクリプティング
IT Pro のための PowerShell スクリプティングIT Pro のための PowerShell スクリプティング
IT Pro のための PowerShell スクリプティング
 

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

CacheとRailsの簡単まとめ
CacheとRailsの簡単まとめCacheとRailsの簡単まとめ
CacheとRailsの簡単まとめ
Huy Do
 
Beginning Java EE 6 勉強会(7) #bje_study
Beginning Java EE 6 勉強会(7) #bje_studyBeginning Java EE 6 勉強会(7) #bje_study
Beginning Java EE 6 勉強会(7) #bje_study
ikeyat
 
Webサーバの基礎知識【編集済み】
Webサーバの基礎知識【編集済み】Webサーバの基礎知識【編集済み】
Webサーバの基礎知識【編集済み】
Kikunaga Taishi
 
JavaプログラマのためのWebSocket概要
JavaプログラマのためのWebSocket概要JavaプログラマのためのWebSocket概要
JavaプログラマのためのWebSocket概要
Shumpei Shiraishi
 
Railsの運用について
Railsの運用についてRailsの運用について
Railsの運用について
Yuuki Namikawa
 
Chromebook 「だけ」で WebRTCを動かそう
Chromebook 「だけ」で WebRTCを動かそうChromebook 「だけ」で WebRTCを動かそう
Chromebook 「だけ」で WebRTCを動かそう
mganeko
 
Hive undocumented feature
Hive undocumented featureHive undocumented feature
Hive undocumented feature
tamtam180
 

Similaire à Java8でhttpサーバを実装してみた (20)

簡単なHTTPサーバの作成
簡単なHTTPサーバの作成簡単なHTTPサーバの作成
簡単なHTTPサーバの作成
 
Osoljp201210 oi swift
Osoljp201210 oi swiftOsoljp201210 oi swift
Osoljp201210 oi swift
 
20080524
2008052420080524
20080524
 
CacheとRailsの簡単まとめ
CacheとRailsの簡単まとめCacheとRailsの簡単まとめ
CacheとRailsの簡単まとめ
 
Beginning Java EE 6 勉強会(7) #bje_study
Beginning Java EE 6 勉強会(7) #bje_studyBeginning Java EE 6 勉強会(7) #bje_study
Beginning Java EE 6 勉強会(7) #bje_study
 
Webサーバの基礎知識【編集済み】
Webサーバの基礎知識【編集済み】Webサーバの基礎知識【編集済み】
Webサーバの基礎知識【編集済み】
 
再入門、サーバープッシュ技術
再入門、サーバープッシュ技術再入門、サーバープッシュ技術
再入門、サーバープッシュ技術
 
2012/6/10 Webのパフォーマンスを考える @ 【第三回】初心者向けホームページ勉強会
2012/6/10 Webのパフォーマンスを考える @ 【第三回】初心者向けホームページ勉強会2012/6/10 Webのパフォーマンスを考える @ 【第三回】初心者向けホームページ勉強会
2012/6/10 Webのパフォーマンスを考える @ 【第三回】初心者向けホームページ勉強会
 
20090328
2009032820090328
20090328
 
WebSocket Protocol と Plack::Middleware::WebSocket
WebSocket Protocol と Plack::Middleware::WebSocketWebSocket Protocol と Plack::Middleware::WebSocket
WebSocket Protocol と Plack::Middleware::WebSocket
 
JavaプログラマのためのWebSocket概要
JavaプログラマのためのWebSocket概要JavaプログラマのためのWebSocket概要
JavaプログラマのためのWebSocket概要
 
nginx + lua + ObjectStorage ファイルアップロード/ダウンロードの高速化
nginx + lua + ObjectStorage  ファイルアップロード/ダウンロードの高速化nginx + lua + ObjectStorage  ファイルアップロード/ダウンロードの高速化
nginx + lua + ObjectStorage ファイルアップロード/ダウンロードの高速化
 
Railsの運用について
Railsの運用についてRailsの運用について
Railsの運用について
 
HTTP入門
HTTP入門HTTP入門
HTTP入門
 
HTML5 開発環境の紹介
HTML5 開発環境の紹介HTML5 開発環境の紹介
HTML5 開発環境の紹介
 
明日から使えるコーディングツール
明日から使えるコーディングツール明日から使えるコーディングツール
明日から使えるコーディングツール
 
Share point開発 ファイル受信
Share point開発 ファイル受信Share point開発 ファイル受信
Share point開発 ファイル受信
 
Chromebook 「だけ」で WebRTCを動かそう
Chromebook 「だけ」で WebRTCを動かそうChromebook 「だけ」で WebRTCを動かそう
Chromebook 「だけ」で WebRTCを動かそう
 
MediaRecorder と WebM で、オレオレ Live Streaming
MediaRecorder と WebM で、オレオレ Live StreamingMediaRecorder と WebM で、オレオレ Live Streaming
MediaRecorder と WebM で、オレオレ Live Streaming
 
Hive undocumented feature
Hive undocumented featureHive undocumented feature
Hive undocumented feature
 

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

Notes de l'éditeur

  1. 全体TODO ・全てのマイルストーンを作成 全体的に
  2. ざっくりとJavaで通信を行うためのプログラムを作って見ましょう
  3. とんでもなくおまじないです
  4. HTTPの説明の内容をもっと深く
  5. 先ほど文字列のやりとりができるようになった でも、自由に文字列をやりとりしていいんですか?っていうとそうじゃない お互いに欲しい情報ってたくさんあって ・クライアントが欲しい情報ってなんだっけ? ・レスポンスで返した方法って ・サーバサイドでちゃんと処理ができたんだっけ? ・etc…etc… でもこれらをサーバもクライアントもめちゃくちゃにしたらコミュニケーションが取れない だから、どんな文字列のやりとりをするのかっていうのをきっちりと決めてあげる
  6. ・HTTP リクエストの形式 ・start-line の形式  ・Method  ・request-target  ・HTTP Version ・header-field の説明  ・こういうヘッダの種類があるよ(要求) http://www.tohoho-web.com/ex/http.htm#headers ・start-lineをもっとよく説明する  ・1行ずつ説明する  ・HOST : みんなの知っているサービスに紐付ける   ・
  7. ・HTTP リクエストの形式 ・start-line の形式  ・Method  ・request-target  ・HTTP Version ・header-field の説明  ・こういうヘッダの種類があるよ(要求) http://www.tohoho-web.com/ex/http.htm#headers ・start-lineをもっとよく説明する  ・1行ずつ説明する  ・HOST : みんなの知っているサービスに紐付ける   ・
  8. ここでコードを見せる
  9. イメージがあまりつかない 一般的な構成 ・
  10. ただし、status-line になっているよ
  11. Content-Type の説明
  12. ・取り合えずmainの中でやる ・Content-Type がおかしなことになれば、文字化けする
  13. 画像、って文字列じゃ扱えない… Section 4-1 にsection 3 のレスポンスの書き込みをバイナリに変換したものを作成しました
  14. 画像、って文字列じゃ扱えない… Section 4-1 にsection 3 のレスポンスの書き込みをバイナリに変換したものを作成しました
  15. 以下が全部同じ http://www.bizreach.co.jp/service http://www.bizreach.co.jp/service/ http://www.bizreach.co.jp/service/index.html
  16. これで section4-2が完成
  17. ・そもそもマルチスレッドってなんだっけ?  ・多重リクエストを受け付けるため  ・レスポンスが重いときにどうする