Enviar pesquisa
Carregar
Java8でhttpサーバを実装してみた
•
Transferir como PPTX, PDF
•
3 gostaram
•
3,252 visualizações
夕
夕人 江熊
Seguir
Java8でhttpサーバを実装してみた 2017/04/06 発表
Leia menos
Leia mais
Engenharia
Denunciar
Compartilhar
Denunciar
Compartilhar
1 de 37
Baixar agora
Recomendados
Java ORマッパー選定のポイント #jsug
Java ORマッパー選定のポイント #jsug
Masatoshi Tada
負荷テストを行う際に知っておきたいこと 初心者編
負荷テストを行う際に知っておきたいこと 初心者編
まべ☆てっく運営
Groovyで楽にSQLを実行してみよう
Groovyで楽にSQLを実行してみよう
Akira Shimosako
Linux Performance Analysis in 15 minutes
Linux Performance Analysis in 15 minutes
Yohei Azekatsu
perfを使ったPostgreSQLの解析(前編)
perfを使ったPostgreSQLの解析(前編)
NTT DATA OSS Professional Services
PHP AST 徹底解説
PHP AST 徹底解説
do_aki
PHP と SAPI と ZendEngine3 と
PHP と SAPI と ZendEngine3 と
do_aki
Redisの特徴と活用方法について
Redisの特徴と活用方法について
Yuji Otani
Recomendados
Java ORマッパー選定のポイント #jsug
Java ORマッパー選定のポイント #jsug
Masatoshi Tada
負荷テストを行う際に知っておきたいこと 初心者編
負荷テストを行う際に知っておきたいこと 初心者編
まべ☆てっく運営
Groovyで楽にSQLを実行してみよう
Groovyで楽にSQLを実行してみよう
Akira Shimosako
Linux Performance Analysis in 15 minutes
Linux Performance Analysis in 15 minutes
Yohei Azekatsu
perfを使ったPostgreSQLの解析(前編)
perfを使ったPostgreSQLの解析(前編)
NTT DATA OSS Professional Services
PHP AST 徹底解説
PHP AST 徹底解説
do_aki
PHP と SAPI と ZendEngine3 と
PHP と SAPI と ZendEngine3 と
do_aki
Redisの特徴と活用方法について
Redisの特徴と活用方法について
Yuji Otani
PostgreSQLクエリ実行の基礎知識 ~Explainを読み解こう~
PostgreSQLクエリ実行の基礎知識 ~Explainを読み解こう~
Miki Shimogai
Amazon RDSを参考にしたとりまチューニング
Amazon RDSを参考にしたとりまチューニング
Shunsuke Mihara
Where狙いのキー、order by狙いのキー
Where狙いのキー、order by狙いのキー
yoku0825
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 概要
Yui Ashikaga
SQLチューニング入門 入門編
SQLチューニング入門 入門編
Miki Shimogai
今こそ知りたいSpring Web(Spring Fest 2020講演資料)
今こそ知りたいSpring Web(Spring Fest 2020講演資料)
NTT DATA Technology & Innovation
徳丸本に学ぶ 安全なPHPアプリ開発の鉄則2011
徳丸本に学ぶ 安全なPHPアプリ開発の鉄則2011
Hiroshi Tokumaru
async/await のしくみ
async/await のしくみ
信之 岩永
スケールアウトするPostgreSQLを目指して!その第一歩!(NTTデータ テクノロジーカンファレンス 2020 発表資料)
スケールアウトするPostgreSQLを目指して!その第一歩!(NTTデータ テクノロジーカンファレンス 2020 発表資料)
NTT DATA Technology & Innovation
TypeScriptをオススメする理由
TypeScriptをオススメする理由
Yusuke Naka
コンポーネント指向と余白の設計
コンポーネント指向と余白の設計
Manabu Yasuda
PHPでWebSocketを実装してみてわかったこと
PHPでWebSocketを実装してみてわかったこと
ksimoji
Docker Compose 徹底解説
Docker Compose 徹底解説
Masahito Zembutsu
php-src の歩き方
php-src の歩き方
do_aki
入門!Jenkins
入門!Jenkins
Shuntaro Saiba
JIT のコードを読んでみた
JIT のコードを読んでみた
y-uti
良いコードとは
良いコードとは
Nobuyuki Matsui
ヤフー社内でやってるMySQLチューニングセミナー大公開
ヤフー社内でやってるMySQLチューニングセミナー大公開
Yahoo!デベロッパーネットワーク
Cognitive Complexity でコードの複雑さを定量的に計測しよう
Cognitive Complexity でコードの複雑さを定量的に計測しよう
Shuto Suzuki
簡単なHTTPサーバの作成
簡単なHTTPサーバの作成
Panu Avakul
Osoljp201210 oi swift
Osoljp201210 oi swift
Noriyasu Sakaue
Mais conteúdo relacionado
Mais procurados
PostgreSQLクエリ実行の基礎知識 ~Explainを読み解こう~
PostgreSQLクエリ実行の基礎知識 ~Explainを読み解こう~
Miki Shimogai
Amazon RDSを参考にしたとりまチューニング
Amazon RDSを参考にしたとりまチューニング
Shunsuke Mihara
Where狙いのキー、order by狙いのキー
Where狙いのキー、order by狙いのキー
yoku0825
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 概要
Yui Ashikaga
SQLチューニング入門 入門編
SQLチューニング入門 入門編
Miki Shimogai
今こそ知りたいSpring Web(Spring Fest 2020講演資料)
今こそ知りたいSpring Web(Spring Fest 2020講演資料)
NTT DATA Technology & Innovation
徳丸本に学ぶ 安全なPHPアプリ開発の鉄則2011
徳丸本に学ぶ 安全なPHPアプリ開発の鉄則2011
Hiroshi Tokumaru
async/await のしくみ
async/await のしくみ
信之 岩永
スケールアウトするPostgreSQLを目指して!その第一歩!(NTTデータ テクノロジーカンファレンス 2020 発表資料)
スケールアウトするPostgreSQLを目指して!その第一歩!(NTTデータ テクノロジーカンファレンス 2020 発表資料)
NTT DATA Technology & Innovation
TypeScriptをオススメする理由
TypeScriptをオススメする理由
Yusuke Naka
コンポーネント指向と余白の設計
コンポーネント指向と余白の設計
Manabu Yasuda
PHPでWebSocketを実装してみてわかったこと
PHPでWebSocketを実装してみてわかったこと
ksimoji
Docker Compose 徹底解説
Docker Compose 徹底解説
Masahito Zembutsu
php-src の歩き方
php-src の歩き方
do_aki
入門!Jenkins
入門!Jenkins
Shuntaro Saiba
JIT のコードを読んでみた
JIT のコードを読んでみた
y-uti
良いコードとは
良いコードとは
Nobuyuki Matsui
ヤフー社内でやってるMySQLチューニングセミナー大公開
ヤフー社内でやってるMySQLチューニングセミナー大公開
Yahoo!デベロッパーネットワーク
Cognitive Complexity でコードの複雑さを定量的に計測しよう
Cognitive Complexity でコードの複雑さを定量的に計測しよう
Shuto Suzuki
Mais procurados
(20)
PostgreSQLクエリ実行の基礎知識 ~Explainを読み解こう~
PostgreSQLクエリ実行の基礎知識 ~Explainを読み解こう~
Amazon RDSを参考にしたとりまチューニング
Amazon RDSを参考にしたとりまチューニング
Where狙いのキー、order by狙いのキー
Where狙いのキー、order by狙いのキー
Unity 2018-2019を見据えたDeNAのUnity開発のこれから [DeNA TechCon 2019]
Unity 2018-2019を見据えたDeNAのUnity開発のこれから [DeNA TechCon 2019]
Virtual Machine Scale Sets 概要
Virtual Machine Scale Sets 概要
SQLチューニング入門 入門編
SQLチューニング入門 入門編
今こそ知りたいSpring Web(Spring Fest 2020講演資料)
今こそ知りたいSpring Web(Spring Fest 2020講演資料)
徳丸本に学ぶ 安全なPHPアプリ開発の鉄則2011
徳丸本に学ぶ 安全なPHPアプリ開発の鉄則2011
async/await のしくみ
async/await のしくみ
スケールアウトするPostgreSQLを目指して!その第一歩!(NTTデータ テクノロジーカンファレンス 2020 発表資料)
スケールアウトするPostgreSQLを目指して!その第一歩!(NTTデータ テクノロジーカンファレンス 2020 発表資料)
TypeScriptをオススメする理由
TypeScriptをオススメする理由
コンポーネント指向と余白の設計
コンポーネント指向と余白の設計
PHPでWebSocketを実装してみてわかったこと
PHPでWebSocketを実装してみてわかったこと
Docker Compose 徹底解説
Docker Compose 徹底解説
php-src の歩き方
php-src の歩き方
入門!Jenkins
入門!Jenkins
JIT のコードを読んでみた
JIT のコードを読んでみた
良いコードとは
良いコードとは
ヤフー社内でやってるMySQLチューニングセミナー大公開
ヤフー社内でやってるMySQLチューニングセミナー大公開
Cognitive Complexity でコードの複雑さを定量的に計測しよう
Cognitive Complexity でコードの複雑さを定量的に計測しよう
Semelhante a Java8でhttpサーバを実装してみた
簡単なHTTPサーバの作成
簡単なHTTPサーバの作成
Panu Avakul
Osoljp201210 oi swift
Osoljp201210 oi swift
Noriyasu Sakaue
20080524
20080524
小野 修司
CacheとRailsの簡単まとめ
CacheとRailsの簡単まとめ
Huy Do
Beginning Java EE 6 勉強会(7) #bje_study
Beginning Java EE 6 勉強会(7) #bje_study
ikeyat
Webサーバの基礎知識【編集済み】
Webサーバの基礎知識【編集済み】
Kikunaga Taishi
再入門、サーバープッシュ技術
再入門、サーバープッシュ技術
Shin Sekaryo
2012/6/10 Webのパフォーマンスを考える @ 【第三回】初心者向けホームページ勉強会
2012/6/10 Webのパフォーマンスを考える @ 【第三回】初心者向けホームページ勉強会
tama200x Kobayashi
20090328
20090328
小野 修司
WebSocket Protocol と Plack::Middleware::WebSocket
WebSocket Protocol と Plack::Middleware::WebSocket
Yu Nobuoka
JavaプログラマのためのWebSocket概要
JavaプログラマのためのWebSocket概要
Shumpei Shiraishi
nginx + lua + ObjectStorage ファイルアップロード/ダウンロードの高速化
nginx + lua + ObjectStorage ファイルアップロード/ダウンロードの高速化
Shuichi Yukimoto
Railsの運用について
Railsの運用について
Yuuki Namikawa
HTTP入門
HTTP入門
Sho A
HTML5 開発環境の紹介
HTML5 開発環境の紹介
tomo_masakura
明日から使えるコーディングツール
明日から使えるコーディングツール
Tomokazu Kiyohara
Share point開発 ファイル受信
Share point開発 ファイル受信
Akihiro Ehara
Chromebook 「だけ」で WebRTCを動かそう
Chromebook 「だけ」で WebRTCを動かそう
mganeko
MediaRecorder と WebM で、オレオレ Live Streaming
MediaRecorder と WebM で、オレオレ Live Streaming
mganeko
Hive undocumented feature
Hive undocumented feature
tamtam180
Semelhante a Java8でhttpサーバを実装してみた
(20)
簡単なHTTPサーバの作成
簡単なHTTPサーバの作成
Osoljp201210 oi swift
Osoljp201210 oi swift
20080524
20080524
CacheとRailsの簡単まとめ
CacheとRailsの簡単まとめ
Beginning Java EE 6 勉強会(7) #bje_study
Beginning Java EE 6 勉強会(7) #bje_study
Webサーバの基礎知識【編集済み】
Webサーバの基礎知識【編集済み】
再入門、サーバープッシュ技術
再入門、サーバープッシュ技術
2012/6/10 Webのパフォーマンスを考える @ 【第三回】初心者向けホームページ勉強会
2012/6/10 Webのパフォーマンスを考える @ 【第三回】初心者向けホームページ勉強会
20090328
20090328
WebSocket Protocol と Plack::Middleware::WebSocket
WebSocket Protocol と Plack::Middleware::WebSocket
JavaプログラマのためのWebSocket概要
JavaプログラマのためのWebSocket概要
nginx + lua + ObjectStorage ファイルアップロード/ダウンロードの高速化
nginx + lua + ObjectStorage ファイルアップロード/ダウンロードの高速化
Railsの運用について
Railsの運用について
HTTP入門
HTTP入門
HTML5 開発環境の紹介
HTML5 開発環境の紹介
明日から使えるコーディングツール
明日から使えるコーディングツール
Share point開発 ファイル受信
Share point開発 ファイル受信
Chromebook 「だけ」で WebRTCを動かそう
Chromebook 「だけ」で WebRTCを動かそう
MediaRecorder と WebM で、オレオレ Live Streaming
MediaRecorder と WebM で、オレオレ Live Streaming
Hive undocumented feature
Hive undocumented feature
Java8でhttpサーバを実装してみた
1.
JavaでHTTPサーバを 実装してみた 2017/4/6
2.
準備等 • 準備する内容 • GoogleChrome
のインストール • java8 のインストール • maven のインストール • intelliJ のインストール • https://github.com/YutoEguma/HTTPServerPractice をgit cloneして おく • connpass ページにも記載しています • https://github.com/YutoEguma/HTTPServerPractice/blob/master/RE ADME.md
3.
アジェンダ • 概要 • ServerSocketを使ってみる •
HTTP Request を覗いてみる • HTTP Response を返してみる • HTTP Requestに応じてファイルを読み込む • マルチスレッドにする
4.
概要
5.
今回作成したHTTPサーバの概要 Server Socket Socket HTTP Request HTTP Response Contents Loader Socket ① HTTP リクエストを作成②
通信の 受け口を作成 ③リクエストの 読み込み ④リクエストの中身を判断して ファイルを読み込む ⑤レスポンスの 書き込み クライアント サーバ
6.
デモ • webapp/public 以下にコンテンツを配置 •
ブラウザからのHTTPリクエストを解析する • 解析結果によってHTTPレスポンスを返す • HTML/CSS,Javascript • PING,JPEG形式の画像 • HTTPServerPractice の section5/SampleWebServer を起動
7.
Section1 ServerSocketを使ってみる
8.
• ServerSocketとは「接続を受け付けるもの」 • Socketとは「通信の窓口」 •
ServerSocketが接続を受け付けると、サーバとクライ アント間のやりとりをするためのScketを作成 ServerSocket・Socket
9.
とりあえず書いてみる
10.
今の状態 Server Socket Socket Socket ① HTTP リクエストを作成 ②
Socket を作成 ③リクエストの 読み込み ⑤レスポンスの 書き込み クライアント サーバ ログに出しただけ 適当に文字列を作る
11.
動作確認 • section1/SampleWebServer を起動 •
以下の2つの方法で確認できる • curlコマンドを実行 • $ curl -i http://localhost:8090 • ブラウザで http://localhost:8090 にアクセス
12.
Section2 HTTP Request を覗いてみる
13.
そもそもHTTPって何? Hypertext Transfer Protocol(ハイパーテキスト・トランスファー・プロト コル、略称
HTTP)とは、HTMLなどのコンテンツの送受信に用いられる通 信プロトコルである。主としてWorld Wide Webにおいて、Webブラウザと Webサーバとの間での転送に用いられる。ハイパーテキスト転送プロトコ ルとも呼ばれる。 引用:Wikipedia
14.
ざっくりとした仕組み サーバ クライアント 決められた形式の リクエストメッセージ 決められた形式の レスポンスメッセージ
15.
HTTP メッセージの形式 • HTTP
メッセージの形式 • Start-line の形式 • request-line の形式
16.
HTTP メッセージの形式 • Header-field
17.
…. いや… よくわからん!!
18.
実例を見よう(section1でのログ) GET SP /request-target
SP HTTP/1.1 CRLF Host : OWS localhost:8090 OWS Connection : OWS keep-alive OWS
19.
リクエストのheader-fieldの種類 • 一例がこちら • http://www.atmarkit.co.jp/fnetwork/rensai/netpro01/he ader-fields.html •
数が多い • 拡張性があるような仕様になっている • つまり何がくるかわからない
20.
HTTPRequestクラスを作ってみる • InputStreamをコンストラクタし文字列を取り出す • クラスに持つ情報 •
request-lineの3つの要素 • header-fieldを(Mapで保持) • すべてのheader-nameを網羅できない
21.
今の状態 Server Socket Socket HTTP Request Socket ① HTTP
リクエストを作成 ② Socket を作成 ③リクエストの 読み込み ⑤レスポンスの 書き込み クライアント サーバ 適当に文字列を作る ログに出しただけ
22.
Section3 HTTP Response を返してみる
23.
HTTP メッセージの形式 (おさらい
+ α) • HTTP メッセージの形式 • Start-line の形式 • status-line の形式
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.
HTTP Response の例
26.
レスポンスのheader-fieldの種類 • 一例がこちら • http://www.atmarkit.co.jp/fnetwork/rensai/netpro01/he ader-fields.html •
数が多い • HTTPの仕様上 拡張性があるような仕様になっている • つまりその時々で書き出す情報が異なる
27.
HTTPResponseクラスを実装してみる • HTTPステータスで初期化する • クラスに持つ情報 •
request-lineの3つの要素 • header-field(Mapで保持) • すべてのheader-nameを網羅できない • content-type, content-length をとりあえず入れる • コンテンツ(message-body)
28.
今の状態 Server Socket Socket HTTP Request HTTP Response Socket ① HTTP
リクエストを作成 ② Socket を作成 ③リクエストの 読み込み ⑤レスポンスの 書き込み クライアント サーバ ログに出しただけ 適当に作っただけ
29.
Section4 HTTP Request に応じて ファイルを読み込む
30.
その前に… HTTPレスポンスの message-body が 必ず文字列とは限らない!! コンテンツを文字列で扱うのを諦める…しかない… コンテンツ系は全部バイナリで扱う
31.
HTTP Response をバイナリにする •
HTTP Response の body をバイト型に • getResponse をレスポンスをbyte型配列に変換する処 理に変更 • section4-1を参照
32.
ファイル読み込みルールはこんな感じ • HTTPRequestのrequest-targetのパスにあるものを読み込めば良 い • 以下の方法ルールで読み込む •
request-targetとファイルの対応 • /hoge/fuga.html • Project/src/main/resources/public/hoge/fuga.html • request-targetに拡張子の指定がなければディレクトリとみな し、index.htmlを探す • Section4-2 参照
33.
今の状態 Server Socket Socket HTTP Request HTTP Response Contents Loader Socket ① HTTP リクエストを作成 ②
Socket を作成 ③リクエストの 読み込み ④リクエストの中身を判断して ファイルを読み込む ⑤レスポンスの 書き込み クライアント サーバ
34.
Section5 マルチスレッドにする
35.
なぜマルチスレッドにするの? • 処理の高速化のため • 1回のレスポンスがとても重いとき、全て待たされる •
多重リクエストを受け付けるため • section4-2をとんでもなく遅くしてみるデモ • とてつもなく重いレスポンスを返す処理のあとに、 軽い接続があった時にどうなるのか?
36.
CreateResponseTaskを書いてみる • socketのスコープを切り出す • socketができたら、その上での通信の処理は全て各ス レッドに任せる •
Section5 参照
37.
以上で簡単なHTTPサーバの 実装は終わりです
Notas do Editor
全体TODO ・全てのマイルストーンを作成 全体的に
ざっくりとJavaで通信を行うためのプログラムを作って見ましょう
とんでもなくおまじないです
HTTPの説明の内容をもっと深く
先ほど文字列のやりとりができるようになった でも、自由に文字列をやりとりしていいんですか?っていうとそうじゃない お互いに欲しい情報ってたくさんあって ・クライアントが欲しい情報ってなんだっけ? ・レスポンスで返した方法って ・サーバサイドでちゃんと処理ができたんだっけ? ・etc…etc… でもこれらをサーバもクライアントもめちゃくちゃにしたらコミュニケーションが取れない だから、どんな文字列のやりとりをするのかっていうのをきっちりと決めてあげる
・HTTP リクエストの形式 ・start-line の形式 ・Method ・request-target ・HTTP Version ・header-field の説明 ・こういうヘッダの種類があるよ(要求) http://www.tohoho-web.com/ex/http.htm#headers ・start-lineをもっとよく説明する ・1行ずつ説明する ・HOST : みんなの知っているサービスに紐付ける ・
・HTTP リクエストの形式 ・start-line の形式 ・Method ・request-target ・HTTP Version ・header-field の説明 ・こういうヘッダの種類があるよ(要求) http://www.tohoho-web.com/ex/http.htm#headers ・start-lineをもっとよく説明する ・1行ずつ説明する ・HOST : みんなの知っているサービスに紐付ける ・
ここでコードを見せる
イメージがあまりつかない 一般的な構成 ・
ただし、status-line になっているよ
Content-Type の説明
・取り合えずmainの中でやる ・Content-Type がおかしなことになれば、文字化けする
画像、って文字列じゃ扱えない… Section 4-1 にsection 3 のレスポンスの書き込みをバイナリに変換したものを作成しました
画像、って文字列じゃ扱えない… Section 4-1 にsection 3 のレスポンスの書き込みをバイナリに変換したものを作成しました
以下が全部同じ http://www.bizreach.co.jp/service http://www.bizreach.co.jp/service/ http://www.bizreach.co.jp/service/index.html
これで section4-2が完成
・そもそもマルチスレッドってなんだっけ? ・多重リクエストを受け付けるため ・レスポンスが重いときにどうする
Baixar agora