SlideShare uma empresa Scribd logo
1 de 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サーバの
実装は終わりです

Mais conteúdo relacionado

Mais procurados

PostgreSQLクエリ実行の基礎知識 ~Explainを読み解こう~
PostgreSQLクエリ実行の基礎知識 ~Explainを読み解こう~PostgreSQLクエリ実行の基礎知識 ~Explainを読み解こう~
PostgreSQLクエリ実行の基礎知識 ~Explainを読み解こう~Miki Shimogai
 
Amazon RDSを参考にしたとりまチューニング
Amazon RDSを参考にしたとりまチューニングAmazon RDSを参考にしたとりまチューニング
Amazon RDSを参考にしたとりまチューニングShunsuke Mihara
 
Where狙いのキー、order by狙いのキー
Where狙いのキー、order by狙いのキーWhere狙いのキー、order by狙いのキー
Where狙いのキー、order by狙いのキーyoku0825
 
Unity 2018-2019を見据えたDeNAのUnity開発のこれから [DeNA TechCon 2019]
Unity 2018-2019を見据えたDeNAのUnity開発のこれから [DeNA TechCon 2019]Unity 2018-2019を見据えたDeNAのUnity開発のこれから [DeNA TechCon 2019]
Unity 2018-2019を見据えたDeNAのUnity開発のこれから [DeNA TechCon 2019]DeNA
 
Virtual Machine Scale Sets 概要
Virtual Machine Scale Sets 概要Virtual Machine Scale Sets 概要
Virtual Machine Scale Sets 概要Yui Ashikaga
 
SQLチューニング入門 入門編
SQLチューニング入門 入門編SQLチューニング入門 入門編
SQLチューニング入門 入門編Miki Shimogai
 
今こそ知りたいSpring Web(Spring Fest 2020講演資料)
今こそ知りたいSpring Web(Spring Fest 2020講演資料)今こそ知りたいSpring Web(Spring Fest 2020講演資料)
今こそ知りたいSpring Web(Spring Fest 2020講演資料)NTT DATA Technology & Innovation
 
徳丸本に学ぶ 安全なPHPアプリ開発の鉄則2011
徳丸本に学ぶ 安全なPHPアプリ開発の鉄則2011徳丸本に学ぶ 安全なPHPアプリ開発の鉄則2011
徳丸本に学ぶ 安全なPHPアプリ開発の鉄則2011Hiroshi Tokumaru
 
async/await のしくみ
async/await のしくみasync/await のしくみ
async/await のしくみ信之 岩永
 
スケールアウトするPostgreSQLを目指して!その第一歩!(NTTデータ テクノロジーカンファレンス 2020 発表資料)
スケールアウトするPostgreSQLを目指して!その第一歩!(NTTデータ テクノロジーカンファレンス 2020 発表資料)スケールアウトするPostgreSQLを目指して!その第一歩!(NTTデータ テクノロジーカンファレンス 2020 発表資料)
スケールアウトするPostgreSQLを目指して!その第一歩!(NTTデータ テクノロジーカンファレンス 2020 発表資料)NTT DATA Technology & Innovation
 
TypeScriptをオススメする理由
TypeScriptをオススメする理由TypeScriptをオススメする理由
TypeScriptをオススメする理由Yusuke Naka
 
コンポーネント指向と余白の設計
コンポーネント指向と余白の設計コンポーネント指向と余白の設計
コンポーネント指向と余白の設計Manabu Yasuda
 
PHPでWebSocketを実装してみてわかったこと
PHPでWebSocketを実装してみてわかったことPHPでWebSocketを実装してみてわかったこと
PHPでWebSocketを実装してみてわかったことksimoji
 
php-src の歩き方
php-src の歩き方php-src の歩き方
php-src の歩き方do_aki
 
JIT のコードを読んでみた
JIT のコードを読んでみたJIT のコードを読んでみた
JIT のコードを読んでみたy-uti
 
Cognitive Complexity でコードの複雑さを定量的に計測しよう
Cognitive Complexity でコードの複雑さを定量的に計測しようCognitive Complexity でコードの複雑さを定量的に計測しよう
Cognitive Complexity でコードの複雑さを定量的に計測しようShuto Suzuki
 

Mais procurados (20)

PostgreSQLクエリ実行の基礎知識 ~Explainを読み解こう~
PostgreSQLクエリ実行の基礎知識 ~Explainを読み解こう~PostgreSQLクエリ実行の基礎知識 ~Explainを読み解こう~
PostgreSQLクエリ実行の基礎知識 ~Explainを読み解こう~
 
Amazon RDSを参考にしたとりまチューニング
Amazon RDSを参考にしたとりまチューニングAmazon RDSを参考にしたとりまチューニング
Amazon RDSを参考にしたとりまチューニング
 
Where狙いのキー、order by狙いのキー
Where狙いのキー、order by狙いのキーWhere狙いのキー、order by狙いのキー
Where狙いのキー、order by狙いのキー
 
Unity 2018-2019を見据えたDeNAのUnity開発のこれから [DeNA TechCon 2019]
Unity 2018-2019を見据えたDeNAのUnity開発のこれから [DeNA TechCon 2019]Unity 2018-2019を見据えたDeNAのUnity開発のこれから [DeNA TechCon 2019]
Unity 2018-2019を見据えたDeNAのUnity開発のこれから [DeNA TechCon 2019]
 
Virtual Machine Scale Sets 概要
Virtual Machine Scale Sets 概要Virtual Machine Scale Sets 概要
Virtual Machine Scale Sets 概要
 
SQLチューニング入門 入門編
SQLチューニング入門 入門編SQLチューニング入門 入門編
SQLチューニング入門 入門編
 
今こそ知りたいSpring Web(Spring Fest 2020講演資料)
今こそ知りたいSpring Web(Spring Fest 2020講演資料)今こそ知りたいSpring Web(Spring Fest 2020講演資料)
今こそ知りたいSpring Web(Spring Fest 2020講演資料)
 
徳丸本に学ぶ 安全なPHPアプリ開発の鉄則2011
徳丸本に学ぶ 安全なPHPアプリ開発の鉄則2011徳丸本に学ぶ 安全なPHPアプリ開発の鉄則2011
徳丸本に学ぶ 安全なPHPアプリ開発の鉄則2011
 
async/await のしくみ
async/await のしくみasync/await のしくみ
async/await のしくみ
 
スケールアウトするPostgreSQLを目指して!その第一歩!(NTTデータ テクノロジーカンファレンス 2020 発表資料)
スケールアウトするPostgreSQLを目指して!その第一歩!(NTTデータ テクノロジーカンファレンス 2020 発表資料)スケールアウトするPostgreSQLを目指して!その第一歩!(NTTデータ テクノロジーカンファレンス 2020 発表資料)
スケールアウトするPostgreSQLを目指して!その第一歩!(NTTデータ テクノロジーカンファレンス 2020 発表資料)
 
TypeScriptをオススメする理由
TypeScriptをオススメする理由TypeScriptをオススメする理由
TypeScriptをオススメする理由
 
コンポーネント指向と余白の設計
コンポーネント指向と余白の設計コンポーネント指向と余白の設計
コンポーネント指向と余白の設計
 
PHPでWebSocketを実装してみてわかったこと
PHPでWebSocketを実装してみてわかったことPHPでWebSocketを実装してみてわかったこと
PHPでWebSocketを実装してみてわかったこと
 
Docker Compose 徹底解説
Docker Compose 徹底解説Docker Compose 徹底解説
Docker Compose 徹底解説
 
php-src の歩き方
php-src の歩き方php-src の歩き方
php-src の歩き方
 
入門!Jenkins
入門!Jenkins入門!Jenkins
入門!Jenkins
 
JIT のコードを読んでみた
JIT のコードを読んでみたJIT のコードを読んでみた
JIT のコードを読んでみた
 
良いコードとは
良いコードとは良いコードとは
良いコードとは
 
ヤフー社内でやってるMySQLチューニングセミナー大公開
ヤフー社内でやってるMySQLチューニングセミナー大公開ヤフー社内でやってるMySQLチューニングセミナー大公開
ヤフー社内でやってるMySQLチューニングセミナー大公開
 
Cognitive Complexity でコードの複雑さを定量的に計測しよう
Cognitive Complexity でコードの複雑さを定量的に計測しようCognitive Complexity でコードの複雑さを定量的に計測しよう
Cognitive Complexity でコードの複雑さを定量的に計測しよう
 

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

簡単なHTTPサーバの作成
簡単なHTTPサーバの作成簡単なHTTPサーバの作成
簡単なHTTPサーバの作成Panu Avakul
 
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_studyikeyat
 
Webサーバの基礎知識【編集済み】
Webサーバの基礎知識【編集済み】Webサーバの基礎知識【編集済み】
Webサーバの基礎知識【編集済み】Kikunaga Taishi
 
再入門、サーバープッシュ技術
再入門、サーバープッシュ技術再入門、サーバープッシュ技術
再入門、サーバープッシュ技術Shin Sekaryo
 
2012/6/10 Webのパフォーマンスを考える @ 【第三回】初心者向けホームページ勉強会
2012/6/10 Webのパフォーマンスを考える @ 【第三回】初心者向けホームページ勉強会2012/6/10 Webのパフォーマンスを考える @ 【第三回】初心者向けホームページ勉強会
2012/6/10 Webのパフォーマンスを考える @ 【第三回】初心者向けホームページ勉強会tama200x Kobayashi
 
WebSocket Protocol と Plack::Middleware::WebSocket
WebSocket Protocol と Plack::Middleware::WebSocketWebSocket Protocol と Plack::Middleware::WebSocket
WebSocket Protocol と Plack::Middleware::WebSocketYu Nobuoka
 
JavaプログラマのためのWebSocket概要
JavaプログラマのためのWebSocket概要JavaプログラマのためのWebSocket概要
JavaプログラマのためのWebSocket概要Shumpei Shiraishi
 
nginx + lua + ObjectStorage ファイルアップロード/ダウンロードの高速化
nginx + lua + ObjectStorage  ファイルアップロード/ダウンロードの高速化nginx + lua + ObjectStorage  ファイルアップロード/ダウンロードの高速化
nginx + lua + ObjectStorage ファイルアップロード/ダウンロードの高速化Shuichi Yukimoto
 
Railsの運用について
Railsの運用についてRailsの運用について
Railsの運用についてYuuki Namikawa
 
HTTP入門
HTTP入門HTTP入門
HTTP入門Sho A
 
HTML5 開発環境の紹介
HTML5 開発環境の紹介HTML5 開発環境の紹介
HTML5 開発環境の紹介tomo_masakura
 
明日から使えるコーディングツール
明日から使えるコーディングツール明日から使えるコーディングツール
明日から使えるコーディングツールTomokazu Kiyohara
 
Share point開発 ファイル受信
Share point開発 ファイル受信Share point開発 ファイル受信
Share point開発 ファイル受信Akihiro Ehara
 
Chromebook 「だけ」で WebRTCを動かそう
Chromebook 「だけ」で WebRTCを動かそうChromebook 「だけ」で WebRTCを動かそう
Chromebook 「だけ」で WebRTCを動かそうmganeko
 
MediaRecorder と WebM で、オレオレ Live Streaming
MediaRecorder と WebM で、オレオレ Live StreamingMediaRecorder と WebM で、オレオレ Live Streaming
MediaRecorder と WebM で、オレオレ Live Streamingmganeko
 
Hive undocumented feature
Hive undocumented featureHive undocumented feature
Hive undocumented featuretamtam180
 

Semelhante a 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サーバを実装してみた

Notas do Editor

  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. ・そもそもマルチスレッドってなんだっけ?  ・多重リクエストを受け付けるため  ・レスポンスが重いときにどうする