Suche senden
Hochladen
Java8でhttpサーバを実装してみた
•
Als PPTX, PDF herunterladen
•
3 gefällt mir
•
3,250 views
夕
夕人 江熊
Folgen
Java8でhttpサーバを実装してみた 2017/04/06 発表
Weniger lesen
Mehr lesen
Ingenieurwesen
Melden
Teilen
Melden
Teilen
1 von 37
Jetzt herunterladen
Empfohlen
Spring starterによるSpring Boot Starter
Spring starterによるSpring Boot Starter
Ryosuke Uchitate
Python におけるドメイン駆動設計(戦術面)の勘どころ
Python におけるドメイン駆動設計(戦術面)の勘どころ
Junya Hayashi
.NET 7 での ASP.NET Core Blazor の新機能ピックアップ
.NET 7 での ASP.NET Core Blazor の新機能ピックアップ
一希 大田
実践に向けたドメイン駆動設計のエッセンス
実践に向けたドメイン駆動設計のエッセンス
増田 亨
Elasticsearch の検索精度のチューニング 〜テストを作って高速かつ安全に〜
Elasticsearch の検索精度のチューニング 〜テストを作って高速かつ安全に〜
Takahiko Ito
Kubernetes 疲れに Azure Container Apps はいかがでしょうか?(江東区合同ライトニングトーク 発表資料)
Kubernetes 疲れに Azure Container Apps はいかがでしょうか?(江東区合同ライトニングトーク 発表資料)
NTT DATA Technology & Innovation
C#実装から見るDDD(ドメイン駆動設計)
C#実装から見るDDD(ドメイン駆動設計)
Takuya Kawabe
オブジェクト指向プログラミング入門 -- Java object-oriented programming primer
オブジェクト指向プログラミング入門 -- Java object-oriented programming primer
増田 亨
Empfohlen
Spring starterによるSpring Boot Starter
Spring starterによるSpring Boot Starter
Ryosuke Uchitate
Python におけるドメイン駆動設計(戦術面)の勘どころ
Python におけるドメイン駆動設計(戦術面)の勘どころ
Junya Hayashi
.NET 7 での ASP.NET Core Blazor の新機能ピックアップ
.NET 7 での ASP.NET Core Blazor の新機能ピックアップ
一希 大田
実践に向けたドメイン駆動設計のエッセンス
実践に向けたドメイン駆動設計のエッセンス
増田 亨
Elasticsearch の検索精度のチューニング 〜テストを作って高速かつ安全に〜
Elasticsearch の検索精度のチューニング 〜テストを作って高速かつ安全に〜
Takahiko Ito
Kubernetes 疲れに Azure Container Apps はいかがでしょうか?(江東区合同ライトニングトーク 発表資料)
Kubernetes 疲れに Azure Container Apps はいかがでしょうか?(江東区合同ライトニングトーク 発表資料)
NTT DATA Technology & Innovation
C#実装から見るDDD(ドメイン駆動設計)
C#実装から見るDDD(ドメイン駆動設計)
Takuya Kawabe
オブジェクト指向プログラミング入門 -- Java object-oriented programming primer
オブジェクト指向プログラミング入門 -- Java object-oriented programming primer
増田 亨
Spiderストレージエンジンのご紹介
Spiderストレージエンジンのご紹介
Kentoku
AWSのNoSQL入門
AWSのNoSQL入門
Akihiro Kuwano
Web App for Containers + MySQLでコンテナ対応したPHPアプリを作ろう!
Web App for Containers + MySQLでコンテナ対応したPHPアプリを作ろう!
Yoichi Kawasaki
分散トレーシングAWS:X-Rayとの上手い付き合い方
分散トレーシングAWS:X-Rayとの上手い付き合い方
Recruit Lifestyle Co., Ltd.
ドメイン駆動設計の学習曲線とブレークポイント
ドメイン駆動設計の学習曲線とブレークポイント
増田 亨
ドメイン駆動設計 本格入門
ドメイン駆動設計 本格入門
増田 亨
DDD sample code explained in Java
DDD sample code explained in Java
増田 亨
Apache Airflow入門 (マーケティングデータ分析基盤技術勉強会)
Apache Airflow入門 (マーケティングデータ分析基盤技術勉強会)
Takeshi Mikami
AWS Black Belt Online Seminar 2018 Amazon DynamoDB Advanced Design Pattern
AWS Black Belt Online Seminar 2018 Amazon DynamoDB Advanced Design Pattern
Amazon Web Services Japan
Kinesis + Elasticsearchでつくるさいきょうのログ分析基盤
Kinesis + Elasticsearchでつくるさいきょうのログ分析基盤
Amazon Web Services Japan
DynamoDB設計のちょっとした技
DynamoDB設計のちょっとした技
Yoichi Toyota
3週連続DDDその1 ドメイン駆動設計の基本を理解する
3週連続DDDその1 ドメイン駆動設計の基本を理解する
増田 亨
PostgreSQLからのデータ連携/同期も完全対応!DBを『活かす』なら、Syniti DR 9.7!
PostgreSQLからのデータ連携/同期も完全対応!DBを『活かす』なら、Syniti DR 9.7!
株式会社クライム
Azure AD とアプリケーションを SAML 連携する際に陥る事例と対処方法について
Azure AD とアプリケーションを SAML 連携する際に陥る事例と対処方法について
Shinya Yamaguchi
Kubernete Meetup Tokyo #18 - Kubebuilder/controller-runtime 入門
Kubernete Meetup Tokyo #18 - Kubebuilder/controller-runtime 入門
Preferred Networks
JavaScript GIS ライブラリ turf.js 入門
JavaScript GIS ライブラリ turf.js 入門
Takahiro Kamada
なぜ「マイクロサービス“化”」が必要なのか
なぜ「マイクロサービス“化”」が必要なのか
Yusuke Suzuki
DockerコンテナでGitを使う
DockerコンテナでGitを使う
Kazuhiro Suga
Azure Search 大全
Azure Search 大全
Daiyu Hatakeyama
はじめてのElasticsearchクラスタ
はじめてのElasticsearchクラスタ
Satoyuki Tsukano
簡単なHTTPサーバの作成
簡単なHTTPサーバの作成
Panu Avakul
Osoljp201210 oi swift
Osoljp201210 oi swift
Noriyasu Sakaue
Weitere ähnliche Inhalte
Was ist angesagt?
Spiderストレージエンジンのご紹介
Spiderストレージエンジンのご紹介
Kentoku
AWSのNoSQL入門
AWSのNoSQL入門
Akihiro Kuwano
Web App for Containers + MySQLでコンテナ対応したPHPアプリを作ろう!
Web App for Containers + MySQLでコンテナ対応したPHPアプリを作ろう!
Yoichi Kawasaki
分散トレーシングAWS:X-Rayとの上手い付き合い方
分散トレーシングAWS:X-Rayとの上手い付き合い方
Recruit Lifestyle Co., Ltd.
ドメイン駆動設計の学習曲線とブレークポイント
ドメイン駆動設計の学習曲線とブレークポイント
増田 亨
ドメイン駆動設計 本格入門
ドメイン駆動設計 本格入門
増田 亨
DDD sample code explained in Java
DDD sample code explained in Java
増田 亨
Apache Airflow入門 (マーケティングデータ分析基盤技術勉強会)
Apache Airflow入門 (マーケティングデータ分析基盤技術勉強会)
Takeshi Mikami
AWS Black Belt Online Seminar 2018 Amazon DynamoDB Advanced Design Pattern
AWS Black Belt Online Seminar 2018 Amazon DynamoDB Advanced Design Pattern
Amazon Web Services Japan
Kinesis + Elasticsearchでつくるさいきょうのログ分析基盤
Kinesis + Elasticsearchでつくるさいきょうのログ分析基盤
Amazon Web Services Japan
DynamoDB設計のちょっとした技
DynamoDB設計のちょっとした技
Yoichi Toyota
3週連続DDDその1 ドメイン駆動設計の基本を理解する
3週連続DDDその1 ドメイン駆動設計の基本を理解する
増田 亨
PostgreSQLからのデータ連携/同期も完全対応!DBを『活かす』なら、Syniti DR 9.7!
PostgreSQLからのデータ連携/同期も完全対応!DBを『活かす』なら、Syniti DR 9.7!
株式会社クライム
Azure AD とアプリケーションを SAML 連携する際に陥る事例と対処方法について
Azure AD とアプリケーションを SAML 連携する際に陥る事例と対処方法について
Shinya Yamaguchi
Kubernete Meetup Tokyo #18 - Kubebuilder/controller-runtime 入門
Kubernete Meetup Tokyo #18 - Kubebuilder/controller-runtime 入門
Preferred Networks
JavaScript GIS ライブラリ turf.js 入門
JavaScript GIS ライブラリ turf.js 入門
Takahiro Kamada
なぜ「マイクロサービス“化”」が必要なのか
なぜ「マイクロサービス“化”」が必要なのか
Yusuke Suzuki
DockerコンテナでGitを使う
DockerコンテナでGitを使う
Kazuhiro Suga
Azure Search 大全
Azure Search 大全
Daiyu Hatakeyama
はじめてのElasticsearchクラスタ
はじめてのElasticsearchクラスタ
Satoyuki Tsukano
Was ist angesagt?
(20)
Spiderストレージエンジンのご紹介
Spiderストレージエンジンのご紹介
AWSのNoSQL入門
AWSのNoSQL入門
Web App for Containers + MySQLでコンテナ対応したPHPアプリを作ろう!
Web App for Containers + MySQLでコンテナ対応したPHPアプリを作ろう!
分散トレーシングAWS:X-Rayとの上手い付き合い方
分散トレーシングAWS:X-Rayとの上手い付き合い方
ドメイン駆動設計の学習曲線とブレークポイント
ドメイン駆動設計の学習曲線とブレークポイント
ドメイン駆動設計 本格入門
ドメイン駆動設計 本格入門
DDD sample code explained in Java
DDD sample code explained in Java
Apache Airflow入門 (マーケティングデータ分析基盤技術勉強会)
Apache Airflow入門 (マーケティングデータ分析基盤技術勉強会)
AWS Black Belt Online Seminar 2018 Amazon DynamoDB Advanced Design Pattern
AWS Black Belt Online Seminar 2018 Amazon DynamoDB Advanced Design Pattern
Kinesis + Elasticsearchでつくるさいきょうのログ分析基盤
Kinesis + Elasticsearchでつくるさいきょうのログ分析基盤
DynamoDB設計のちょっとした技
DynamoDB設計のちょっとした技
3週連続DDDその1 ドメイン駆動設計の基本を理解する
3週連続DDDその1 ドメイン駆動設計の基本を理解する
PostgreSQLからのデータ連携/同期も完全対応!DBを『活かす』なら、Syniti DR 9.7!
PostgreSQLからのデータ連携/同期も完全対応!DBを『活かす』なら、Syniti DR 9.7!
Azure AD とアプリケーションを SAML 連携する際に陥る事例と対処方法について
Azure AD とアプリケーションを SAML 連携する際に陥る事例と対処方法について
Kubernete Meetup Tokyo #18 - Kubebuilder/controller-runtime 入門
Kubernete Meetup Tokyo #18 - Kubebuilder/controller-runtime 入門
JavaScript GIS ライブラリ turf.js 入門
JavaScript GIS ライブラリ turf.js 入門
なぜ「マイクロサービス“化”」が必要なのか
なぜ「マイクロサービス“化”」が必要なのか
DockerコンテナでGitを使う
DockerコンテナでGitを使う
Azure Search 大全
Azure Search 大全
はじめてのElasticsearchクラスタ
はじめてのElasticsearchクラスタ
Ähnlich wie 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
Ähnlich wie 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サーバの 実装は終わりです
Hinweis der Redaktion
全体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が完成
・そもそもマルチスレッドってなんだっけ? ・多重リクエストを受け付けるため ・レスポンスが重いときにどうする
Jetzt herunterladen