SlideShare a Scribd company logo
1 of 139
Javaで学ぶ
ネットワークプログラミングの基礎
JJUG CCC 2019 Fall
#jjug_ccc #ccc_i3
2019-11-23
株式会社オープントーン 渡邉 一夫
#jjug_ccc #ccc_i3
はじめに
• TCP/IPのネットワークプログラミングについて
• ネットワークプログラミングは言語に依存しません
• Javaだけでなく他の言語でも転用可能
• ネットワークを理解する助けになれば幸いです
#jjug_ccc #ccc_i3
自己紹介
• 名前:渡邉 一夫 ( Twitter → @nave_kazu )
• エンジニア歴:20年
• 所属:株式会社オープントーン
• 秋葉原
• 勤怠管理システム
• ヘルス・メディテック
• 観光ビッグデータ
• ディープラーニング
• AWSのAPNパートナー
• エンジニア募集中!
#jjug_ccc #ccc_i3
自己紹介
• 名前:渡邉 一夫 ( Twitter → @nave_kazu )
• Java歴:20年弱
• DB設計してSpring BootでWeb APIを書いたり、
AngularやVue.jsでクライアントを書いたり、
AWSでインフラ構築したり、、フルスタック?エンジニア
• JJUG CCCは2014年ごろから参加
• JJUG CCC 2018 Fall、2019 Springで登壇
• SQL実行ツールを作るのがライフワーク
#jjug_ccc #ccc_i3
自己紹介
• 名前:渡邉 一夫 ( Twitter → @nave_kazu )
• その他
• 共著 システム開発のための見積りのすべてがわかる本
• AWS 認定ソリューションアーキテクト–アソシエイト取得
• Study up!( https://studyup.info/ )の運営
#jjug_ccc #ccc_i3
自己紹介
• HEAVY ROTATION → BAND-MAID
#jjug_ccc #ccc_i3
アジェンダ
• インターネットの基礎
• インターネット層について
• トランスポート層について
• アプリケーション層について
• Javaでネットワークプログラミング
#jjug_ccc #ccc_i3
インターネットの基礎
• インターネットとは?
• インターネットとはインターネット プロトコル スイート
を使用し、複数のコンピュータネットワークを相互接続し
た、グローバルなネットワークのことである。
Wikipediaより
#jjug_ccc #ccc_i3
インターネットの基礎
• インターネット プロトコル スイート
• ホスト間で通信をするための取り決め(プロトコル)を
集めた「規格集」
• 4階層に分かれていて、それぞれ役割を担っている
• 下位層になるほど物理的な規格に基づく
#jjug_ccc #ccc_i3
インターネットの基礎
• インターネット プロトコル スイート
• 4階層に分かれていて、それぞれ役割を担っている
アプリケーション層 システムやサービスに必要な機能を実装
トランスポート層 誤り検出、自動再送要求、輻輳回避など
インターネット層 通信エンドポイント
リンク層 物理的に繋がった機器間でデータの受渡を行う
#jjug_ccc #ccc_i3
インターネットの基礎
• インターネット プロトコル スイート
• 隣り合った階層でやり取りを行う
アプリケーション層
トランスポート層
インターネット層
リンク層
アプリケーション層
トランスポート層
インターネット層
リンク層
端末A 端末B
#jjug_ccc #ccc_i3
インターネットの基礎
• パケット
• 送信内容をパケットに入れてやり取りする
• パケット = 小包
• ヘッダー部とデータ部(ペイロードとも言う)から構成
• ヘッダー部 = 荷札
• データ部 = 荷物
• ヘッダー部には各階層で通信に必要な情報を詰める
#jjug_ccc #ccc_i3
インターネットの基礎
• パケットのフロー (Google検索の例)
アプリケーション層 データ
トランスポート層
インターネット層
リンク層
送信したいデータ
(Google検索のワード「BAND-MAID」)
#jjug_ccc #ccc_i3
インターネットの基礎
• パケットのフロー (Google検索の例)
アプリケーション層 ヘッダー データ
トランスポート層
インターネット層
リンク層
アプリケーション層
固有のヘッダー情報
(検索ワード送信先URL)
送信したいデータ
(Google検索のワード「BAND-MAID」)
#jjug_ccc #ccc_i3
インターネットの基礎
• パケットのフロー (Google検索の例)
アプリケーション層 ヘッダー データ
トランスポート層
インターネット層
リンク層
アプリケーション層の
パケット
#jjug_ccc #ccc_i3
インターネットの基礎
• パケットのフロー (Google検索の例)
アプリケーション層 ヘッダー データ
トランスポート層 ヘッダー データ
インターネット層
リンク層
上位層のパケットをデータに
#jjug_ccc #ccc_i3
インターネットの基礎
• パケットのフロー (Google検索の例)
アプリケーション層 ヘッダー データ
トランスポート層 ヘッダー データ
インターネット層
リンク層
上位層のパケットをデータに
トランスポート層
固有のヘッダー情報
(TCP & ポート番号)
#jjug_ccc #ccc_i3
インターネットの基礎
• パケットのフロー (Google検索の例)
アプリケーション層 ヘッダー データ
トランスポート層 ヘッダー データ
インターネット層 ヘッダー データ
リンク層
上位層のパケットをデータに
#jjug_ccc #ccc_i3
インターネットの基礎
• パケットのフロー (Google検索の例)
アプリケーション層 ヘッダー データ
トランスポート層 ヘッダー データ
インターネット層 ヘッダー データ
リンク層
上位層のパケットをデータに
インターネット層
固有のヘッダー情報
(IPアドレス)
#jjug_ccc #ccc_i3
インターネットの基礎
• パケットのフロー (Google検索の例)
アプリケーション層 ヘッダー データ
トランスポート層 ヘッダー データ
インターネット層 ヘッダー データ
リンク層 ヘッダー データ
上位層のパケットをデータに
リンク層
固有のヘッダー情報
(MACアドレス)
#jjug_ccc #ccc_i3
インターネットの基礎
• パケットのフロー (Google検索の例)
アプリケーション層 ヘッダー データ
トランスポート層 ヘッダー データ
インターネット層 ヘッダー データ
リンク層 ヘッダー データ
パケットを受け取ったら
データ部を上位層に渡す
(荷解き)
#jjug_ccc #ccc_i3
インターネットの基礎
• パケットのフロー (Google検索の例)
アプリケーション層 ヘッダー データ
トランスポート層 ヘッダー データ
インターネット層 ヘッダー データ
リンク層
#jjug_ccc #ccc_i3
インターネットの基礎
• パケットのフロー (Google検索の例)
アプリケーション層 ヘッダー データ
トランスポート層 ヘッダー データ
インターネット層
リンク層
#jjug_ccc #ccc_i3
インターネットの基礎
• パケットのフロー (Google検索の例)
アプリケーション層 ヘッダー データ
トランスポート層
インターネット層
リンク層
#jjug_ccc #ccc_i3
インターネットの基礎
• パケットのフロー (Google検索の例)
アプリケーション層 データ
トランスポート層
インターネット層
リンク層
Google検索のワードを
取り出す
#jjug_ccc #ccc_i3
インターネットの基礎
• リンク層について
アプリケーション層 システムやサービスに必要な機能を実装
トランスポート層 誤り検出、自動再送要求、輻輳回避など
インターネット層 通信エンドポイント
リンク層 物理的に繋がった機器間でデータの受渡を行う
#jjug_ccc #ccc_i3
インターネットの基礎
• リンク層について
• イーサネット(有線LAN)やWi-Fi(無線LAN)
• 隣接するネットワークノード間での取り決め
アプリケーション層
トランスポート層
インターネット層
リンク層
アプリケーション層
トランスポート層
インターネット層
リンク層リンク層
有線LANWi-Fi
#jjug_ccc #ccc_i3
インターネットの基礎
• リンク層について
• イーサネット(有線LAN)やWi-Fi(無線LAN)
• 隣接するネットワークノード間での取り決め
ネットワークプログラミングでは
無視して良い(乱暴)
#jjug_ccc #ccc_i3
インターネットの基礎
• リンク層について
• イーサネット(有線LAN)やWi-Fi(無線LAN)
• 隣接するネットワークノード間での取り決め
ネットワークプログラミングでは
無視して良い(乱暴)
NetworkInterfaceクラスで
情報は取れる
#jjug_ccc #ccc_i3
インターネット層について
アプリケーション層 システムやサービスに必要な機能を実装
トランスポート層 誤り検出、自動再送要求、輻輳回避など
インターネット層 通信エンドポイント
リンク層 物理的に繋がった機器間でデータの受渡を行う
#jjug_ccc #ccc_i3
インターネット層について
• IPアドレス
• インターネット層における端末識別番号
• 通信エンドポイント(PC、スマホ、サーバー)に割り当て
• IPv4とIPv6がある
• IPv4は近い将来枯渇する
• IPv6がなかなか普及しない
#jjug_ccc #ccc_i3
インターネット層について
• IPアドレス
IP アドレス値 個数
IPv4 32ビット 43億個
IPv6 128ビット 340澗(かん)個 (340兆の1兆倍の1兆倍)
#jjug_ccc #ccc_i3
インターネット層について
• IPアドレスの表現方法
IP 表現方法 例
IPv4 8ビットずつ10進法で「.」区切り 192.168.100.9
IPv6 16ビットずつ16進法で「:」区切り fe80::6d06:f17c:6f89:bc36
#jjug_ccc #ccc_i3
インターネット層について
• IPアドレス
IP 表現方法 例
IPv4 8ビットずつ10進法で「.」区切り 192.168.100.9
IPv6 16ビットずつ16進法で「:」区切り fe80::6d06:f17c:6f89:bc36
今回はIPv4についてお話を・・・
#jjug_ccc #ccc_i3
インターネット層について
• IPv4パケットヘッダー
0 8 16 24
バージョン ヘッダー長 サービス種別 全長
識別子 フラグ 断片位置
生存時間 プロトコル チェックサム
送信元IPアドレス
宛先IPアドレス
オプション
0
32
64
96
128
160
192
どのホストから、どのホストへの
通信なのか?
#jjug_ccc #ccc_i3
インターネット層について
• ネットワークアドレスとホストアドレス
IPアドレス 192.168.100.9
サブネットアドレス 255.255.255.0
#jjug_ccc #ccc_i3
インターネット層について
• ネットワークアドレスとホストアドレス
IPアドレス 192.168.100.9
サブネットアドレス 255.255.255.0
ネットワークアドレス
192.168.100.0
サブネットアドレスで
マスクした結果
2
ホストアドレス
0.0.0.9
サブネットアドレスの
残りの部分
#jjug_ccc #ccc_i3
インターネット層について
• サブネット
• ネットワークを論理的に細分化する単位
IPアドレス A 192.168.100.9
IPアドレス B 192.168.100.10
IPアドレス C 192.168.101.9
IPアドレス D 192.168.101.10
サブネットアドレス 255.255.255.0
#jjug_ccc #ccc_i3
インターネット層について
• サブネット
• ネットワークを論理的に細分化する単位
IPアドレス A 192.168.100.9
IPアドレス B 192.168.100.10
IPアドレス C 192.168.101.9
IPアドレス D 192.168.101.10
サブネットアドレス 255.255.255.0
ネットワークアドレス
192.168.100.0
ネットワークアドレス
192.168.101.0
#jjug_ccc #ccc_i3
インターネット層について
• サブネット
• ネットワークを論理的に細分化する単位
IPアドレス A 192.168.100.9
IPアドレス B 192.168.100.10
IPアドレス C 192.168.101.9
IPアドレス D 192.168.101.10
サブネットアドレス 255.255.255.0
ネットワークアドレス
192.168.100.0
ネットワークアドレス
192.168.101.0
直接の通信は出来ない
#jjug_ccc #ccc_i3
インターネット層について
• デフォルトデートウェイ
• 内部と外部ネットワークを接続する
• ルーターがその役割を果たす
IPアドレス 192.168.100.9
デフォルトゲートウェイ 192.168.100.1
#jjug_ccc #ccc_i3
インターネット層について
• デフォルトデートウェイ
• 内部と外部ネットワークを接続する
IPアドレス A 192.168.100.9
IPアドレス B 192.168.100.10
IPアドレス C 192.168.101.9
IPアドレス D 192.168.101.10
サブネットアドレス 255.255.255.0
ネットワークアドレス
192.168.100.0
ネットワークアドレス
192.168.101.0
直接の通信は出来ない
#jjug_ccc #ccc_i3
インターネット層について
• デフォルトデートウェイ
• 内部と外部ネットワークを接続する
IPアドレス A 192.168.100.9
IPアドレス B 192.168.100.10
デフォルトゲートウェイ 192.168.100.1
デフォルトゲートウェイ 192.168.101.1
IPアドレス C 192.168.101.9
IPアドレス D 192.168.101.10
ネットワークアドレス
192.168.100.0
ネットワークアドレス
192.168.101.0
デフォルトゲートウェイを
介して通信する
#jjug_ccc #ccc_i3
インターネット層について
• インターネットとイントラネット
#jjug_ccc #ccc_i3
インターネット層について
• インターネットとイントラネット
• インターネット → グローバルIPアドレスでアクセス
• イントラネット → プライベートIPアドレスでアクセス
#jjug_ccc #ccc_i3
インターネット層について
• グローバルIPアドレスとプライベートIPアドレス
• グローバルIPアドレス → ICANNが管理・割り当て
• プライベートIPアドレス → 自組織内で管理・割り当て
• 勝手に使えない → グローバルIPアドレス
• 勝手に使える → プライベートIPアドレス
インターネット
イントラネット イントラネットルーター
192.168.1.2 192.168.1.2
123.508.0.1 123.508.0.2
#jjug_ccc #ccc_i3
インターネット層について
• グローバルIPアドレスとプライベートIPアドレス
• グローバルIPアドレス → ICANNが管理・割り当て
• プライベートIPアドレス → 自組織内で管理・割り当て
• 勝手に使えない → グローバルIPアドレス
• 勝手に使える → プライベートIPアドレス
インターネット
イントラネット イントラネットルーター
192.168.1.2 192.168.1.2
123.508.0.1 123.508.0.2
世界にひとつだけ
イントラネット内に
ひとつだけ
#jjug_ccc #ccc_i3
インターネット層について
• プライベートIPアドレスの範囲
• RFC 1918で規定
• 3つのクラス(IPアドレス範囲)を定義
クラス IPアドレス範囲 CIDR
クラスA 10.0.0.0 ~ 10.255.255.255 10.0.0.0/8
クラスB 172.16.0.0 ~ 172.31.255.255 172.16.0.0/12
クラスC 192.168.0.0 ~ 192.168.255.255 192.168.0.0/16
#jjug_ccc #ccc_i3
インターネット層について
• CIDR(サイダー)
• ネットワークアドレスの定義方法
CIDR 192.168.100.0/24
#jjug_ccc #ccc_i3
インターネット層について
• CIDR(サイダー)
• ネットワークアドレスの定義方法
CIDR 192.168.100.0/24
32ビットのうち、
先頭から24ビットが
ネットワークアドレス
残りの8ビットが
割り当てられるIPアドレス
#jjug_ccc #ccc_i3
インターネット層について
• CIDR(サイダー)
• ネットワークアドレスの定義方法
AWSでは頻出ワード
AWSの仮装ネットワーク(VPC)作成画面
AWSのサブネット作成画面
#jjug_ccc #ccc_i3
インターネット層について
• 特別なIPアドレス(割り当てられないIPアドレス)
• ローカルホスト
• ネットワークアドレス
• ブロードキャストアドレス
#jjug_ccc #ccc_i3
インターネット層について
• 特別なIPアドレス(割り当てられないIPアドレス)
• ローカルホスト
• 127.0.0.1
• 自分自身のホストを表す
• ループバックアドレス
• 「 localhost 」
#jjug_ccc #ccc_i3
インターネット層について
• 特別なIPアドレス(割り当てられないIPアドレス)
• ネットワークアドレス
• ホストアドレス部のビットがすべて 0 のアドレス
IPアドレス 192.168.100.9
サブネットアドレス 255.255.255.0
ネットワークアドレス 192.168.100.0
#jjug_ccc #ccc_i3
インターネット層について
• 特別なIPアドレス(割り当てられないIPアドレス)
• ブロードキャストアドレス
• ホストアドレス部のビットがすべて 1 のアドレス
• 同一ネットワークアドレスのホストに一斉配信をする
IPアドレス 192.168.100.9
サブネットアドレス 255.255.255.0
ブロードキャストアドレス 192.168.100.255
#jjug_ccc #ccc_i3
トランスポート層について
アプリケーション層 システムやサービスに必要な機能を実装
トランスポート層 誤り検出、自動再送要求、輻輳回避など
インターネット層 通信エンドポイント
リンク層 物理的に繋がった機器間でデータの受渡を行う
#jjug_ccc #ccc_i3
トランスポート層について
• TCPとUDP
#jjug_ccc #ccc_i3
トランスポート層について
• TCPとUDP
• TCP
• コネクション型通信
• 受信確認や再送要求
• 送信順を保証する
• 負荷は高い
• UDP
• コネクションレス型通信
• 受信確認や再送要求は無い
• 送信順は保証しない
• 信頼性より速度重視
#jjug_ccc #ccc_i3
トランスポート層について
• TCPとUDP
• TCP → HTTP、SSH、FTPなど
• UDP → DNS、NTP、DHCPなど
#jjug_ccc #ccc_i3
トランスポート層について
• ポート番号
• 接続するサービスのエンドポイント
• 16ビット → 65,536個
#jjug_ccc #ccc_i3
トランスポート層について
• TCPパケットヘッダー
0 8 16 24
送信元ポート番号 宛先ポート番号
シーケンス番号
確認応答番号
ヘッダ長 予約 コントロールフラグ ウィンドウサイズ
チェックサム 緊急ポインタ
オプション
0
32
64
96
128
160
宛先ポート番号でどのサービスに
接続するのかを指定
#jjug_ccc #ccc_i3
トランスポート層について
• UDPパケットヘッダー
0 8 16 24
送信元ポート番号 宛先ポート番号
パケット長 チェックサム
0
32
#jjug_ccc #ccc_i3
トランスポート層について
• ポート番号の種類
• ウェルノウンポート番号は (IANA) が管理
• 送信元ポート番号は1,024~65,535を使用(RFC 6056)
種類 範囲
ウェルノウンポート番号 0 ~ 1,023
送信元ポート番号 1,024 ~ 65,535
#jjug_ccc #ccc_i3
トランスポート層について
• ウェルノウンポート番号
TCP/UDP ポート番号 アプリケーション層のプロトコル
TCP 20 FTP (データ)
21 FTP (制御)
22 SSH
80 HTTP
443 HTTPS
UDP 53 DNS
67 DHCP(サーバ)
68 DHCP(クライアント)
123 NTP
#jjug_ccc #ccc_i3
トランスポート層について
• ウェルノウンポート番号
• http://www.google.co.jp/ → 宛先ポート80番を使用
• https://www.google.co.jp/ →宛先ポート443番を使用
#jjug_ccc #ccc_i3
トランスポート層について
• ウェルノウンポート番号以外
• http://localhost:8080/ → 宛先ポート8080番を使用
#jjug_ccc #ccc_i3
Javaでネットワークプログラミング
#jjug_ccc #ccc_i3
Javaでネットワークプログラミング
• インターネット層のIPアドレスを指定する(端末エンドポイント)
• トランスポート層のポート番号を指定する(サービスエンドポイント)
• トランスポート層のTCP/UDPどちらかを使用する
#jjug_ccc #ccc_i3
Javaでネットワークプログラミング
• IPアドレスを表現するクラス群
InetAddress
Inet4Address Inet6Address
IP (Internet Protocol)アドレスを
表すクラス
IPアドレスバージョン4 (IPv4)の
アドレスを表すクラス
IPアドレスバージョン6 (IPv6)の
アドレスを表すクラス
JDK1.4から導入
JDK1.0から導入
#jjug_ccc #ccc_i3
Javaでネットワークプログラミング
• IPアドレスを取得する
InetAddress inetAddress = InetAddress.getByName( “www.google.co.jp” );
www.google.co.jp/172.217.25.99
#jjug_ccc #ccc_i3
Javaでネットワークプログラミング
• IPアドレスを取得する
InetAddress inetAddress = InetAddress.getByName( “www.google.co.jp” );
DNS問い合わせをする
#jjug_ccc #ccc_i3
Javaでネットワークプログラミング
• IPアドレスを取得する
• DNS問い合わせ
• コンピューター同士はIPアドレスでしか通信できない
• 人間が覚えやすいように名前を付けたのが「ドメイン名」
• ドメイン名からIPアドレスを調べるプロトコルがDNS
• アプリケーション層のプロトコル
#jjug_ccc #ccc_i3
Javaでネットワークプログラミング
• IPアドレスとポート番号を表現するクラス群
SocketAddress
InetSocketAddress
プロトコルに関連付けられていない
ソケットアドレスを表す
IP ソケットアドレス (IP アドレス + ポート番号) を実装
JDK1.4から導入
#jjug_ccc #ccc_i3
Javaでネットワークプログラミング
• IPアドレスとポート番号を表現するクラス群
InetSocketAddress socketAddress
= new InetSocketAddress( “www.google.co.jp” , 80 );
www.google.co.jp/172.217.26.99:80
#jjug_ccc #ccc_i3
Javaでネットワークプログラミング
• TCPとUDPを表現するクラス群
Socket
SocketChannel
TCP接続
DatagramSocket
DatagramChannel
UDP接続
#jjug_ccc #ccc_i3
Javaでネットワークプログラミング
• TCPとUDPを表現するクラス群
Socket
SocketChannel
TCP接続
DatagramSocket
DatagramChannel
UDP接続
JDK1.0から導入
#jjug_ccc #ccc_i3
Javaでネットワークプログラミング
• TCPとUDPを表現するクラス群
Socket
SocketChannel
TCP接続
DatagramSocket
DatagramChannel
UDP接続
JDK1.4から導入
ノンブロッキングI/Oを提供
#jjug_ccc #ccc_i3
Javaでネットワークプログラミング
• TCP接続する (Socket)
InetAddress inetAddress = InetAddress.getByName( “www.google.co.jp” );
Socket socket = new Socket( inetAddress , 80 );
“www.google.co.jp”の
ポート 80 番に
TCPで接続する
#jjug_ccc #ccc_i3
Javaでネットワークプログラミング
• TCP接続する (Socket)
Socket socket = new Socket( “www.google.co.jp” , 80 );
“www.google.co.jp”の
ポート 80 番に
TCPで接続する
#jjug_ccc #ccc_i3
Javaでネットワークプログラミング
• TCP接続する (SocketChannel)
InetAddress address = InetAddress.getByName( "www.google.co.jp" );
InetSocketAddress socketAddress = new InetSocketAddress( address, 80 );
SocketChannel socket = SocketChannel.open();
socket.connect( socketAddress );
“www.google.co.jp”の
ポート 80 番に
TCPで接続する
#jjug_ccc #ccc_i3
Javaでネットワークプログラミング
• UDP接続する (DatagramSocket)
InetSocketAddress socketAddress
= new InetSocketAddress( "192.168.100.1“ , 53);
DatagramSocket datagramSocket = new DatagramSocket();
datagramSocket.connect(socketAddress);
“192.168.100.1” (LAN上のDNS)の
ポート 53 番に
UDPで接続する
#jjug_ccc #ccc_i3
Javaでネットワークプログラミング
• UDP接続する (DatagramChannel)
InetSocketAddress socketAddress
= new InetSocketAddress( "192.168.100.1“ , 53);
DatagramChannel datagramChannel = DatagramChannel.open();
“192.168.100.1” (LAN上のDNS)の
ポート 53 番に
UDPで接続する
#jjug_ccc #ccc_i3
Javaでネットワークプログラミング
• TCPでアプリケーション層を実装する
アプリケーション層 システムやサービスに必要な機能を実装
トランスポート層 誤り検出、自動再送要求、輻輳回避など
インターネット層 通信エンドポイント
リンク層 物理的に繋がった機器間でデータの受渡を行う
#jjug_ccc #ccc_i3
Javaでネットワークプログラミング
• HTTPクライアント(ブラウザ)を実装する
• HTTPでGoogleトップページを要求する
• TCPで接続する(クライアントになる)方法を学ぶ
• データを送信する(リクエストを送る)方法を学ぶ
• データを受信する(レスポンスを受け取る)方法を学ぶ
#jjug_ccc #ccc_i3
Javaでネットワークプログラミング
• HTTP (Hypertext Transfer Protocol)
• 「HTMLなどのコンテンツの送受信に用いられる
通信プロトコルである」 (Wikipedia)
• クライアントから送る「リクエスト」と
サーバーから返される「レスポンス」から構成される
• テキストの送受信
• TCPで、ウェルノウンポートは80番
#jjug_ccc #ccc_i3
Javaでネットワークプログラミング
• 代表的なHTTPサーバー
• Apache HTTP Server
• Microsoft IIS
• Nginx
• Apache Tomcat
#jjug_ccc #ccc_i3
Javaでネットワークプログラミング
• HTTP (Hypertext Transfer Protocol)
• ヘッダーとボディー
ヘッダー
ボディー
・ヘッダーは改行(CRLF)で区切る
・ヘッダーとボディーの境界は空行
#jjug_ccc #ccc_i3
Javaでネットワークプログラミング
• HTTP (Hypertext Transfer Protocol)
• リクエストのサンプル
GET /⏎
⏎
#jjug_ccc #ccc_i3
Javaでネットワークプログラミング
• HTTP (Hypertext Transfer Protocol)
• リクエストのサンプル
GET /⏎
⏎
HTTPメソッド
要求するリソース(URL)
#jjug_ccc #ccc_i3
Javaでネットワークプログラミング
• HTTP (Hypertext Transfer Protocol)
• HTTPメソッド
GET リソース要求
POST データ送信
PUT データ送信
HEAD HTTPヘッダーのみ要求
DELETE リソース削除
OPTIONS サーバー調査
#jjug_ccc #ccc_i3
Javaでネットワークプログラミング
• HTTP (Hypertext Transfer Protocol)
• リクエストのサンプル
GET /⏎
⏎
TCPで80番ポートに接続後、テキストを送信
HTTPメソッドは「GET」
取得要求のリソースは「/」(ルート)
空行を入れてリクエスト完了
#jjug_ccc #ccc_i3
Javaでネットワークプログラミング
• HTTP (Hypertext Transfer Protocol)
• レスポンスのサンプル
GET /
#jjug_ccc #ccc_i3
Javaでネットワークプログラミング
• HTTP (Hypertext Transfer Protocol)
• レスポンスのサンプル
HTTP/1.0 200 OK
Content-Type: text/html; charset=ISO-8859-1
<html>
・・・
#jjug_ccc #ccc_i3
Javaでネットワークプログラミング
• HTTP (Hypertext Transfer Protocol)
• レスポンスのサンプル
HTTP/1.0 200 OK
Content-Type: text/html; charset=ISO-8859-1
<html>
・・・
HTTPバージョン
#jjug_ccc #ccc_i3
Javaでネットワークプログラミング
• HTTP (Hypertext Transfer Protocol)
• レスポンスのサンプル
HTTP/1.0 200 OK
Content-Type: text/html; charset=ISO-8859-1
<html>
・・・
HTTPステータスコードとメッセージ
#jjug_ccc #ccc_i3
Javaでネットワークプログラミング
• HTTP (Hypertext Transfer Protocol)
• HTTPステータスとメッセージ (一部)
分類 ステータス メッセージ
成功 200 OK
201 Created
リダイレクション 300 Multiple Choices
301 Moved Permanently
クライアントエラー 400 Bad Request
404 Not Found
サーバーエラー 500 Internal Server Error
504 Gateway Timeout
#jjug_ccc #ccc_i3
Javaでネットワークプログラミング
• HTTP (Hypertext Transfer Protocol)
• HTTPステータスとメッセージ (おまけ)
#jjug_ccc #ccc_i3
Javaでネットワークプログラミング
• HTTPクライアント(ブラウザ)を実装する
• HTTPでGoogleトップページを要求する
• TCPで接続する(クライアントになる)方法を学ぶ
• データを送信する(リクエストを送る)方法を学ぶ
• データを受信する(レスポンスを受け取る)方法を学ぶ
#jjug_ccc #ccc_i3
Javaでネットワークプログラミング
• HTTPクライアント(ブラウザ)を実装する
• TCPで、ウェルノウンポート80番に接続
Socket socket = new Socket( “www.google.co.jp“ , 80);
#jjug_ccc #ccc_i3
Javaでネットワークプログラミング
• HTTPクライアント(ブラウザ)を実装する
• HTTPでGoogleトップページを要求する
• TCPで接続する(クライアントになる)方法を学ぶ
• データを送信する(リクエストを送る)方法を学ぶ
• データを受信する(レスポンスを受け取る)方法を学ぶ
#jjug_ccc #ccc_i3
Javaでネットワークプログラミング
• HTTPクライアント(ブラウザ)を実装する
• HTTPのGETリクエストを送信する
String request = "GET /rnrn“;
OutputStream out = socket.getOutputStream( );
out.write( request.getBytes() );
GET /⏎
⏎
#jjug_ccc #ccc_i3
Javaでネットワークプログラミング
• HTTPクライアント(ブラウザ)を実装する
• HTTPでGoogleトップページを要求する
• TCPで接続する(クライアントになる)方法を学ぶ
• データを送信する(リクエストを送る)方法を学ぶ
• データを受信する(レスポンスを受け取る)方法を学ぶ
#jjug_ccc #ccc_i3
Javaでネットワークプログラミング
• HTTPクライアント(ブラウザ)を実装する
• HTTPのレスポンスを受信する
InputStream in = socket.getInputStream( );
int data;
while (( data=in.read()) != -1 ) {
System.out.write( data );
}
#jjug_ccc #ccc_i3
Javaでネットワークプログラミング
• HTTPクライアント(ブラウザ)を実装する
• HTTPのレスポンスを受信する
HTTP/1.0 200 OK
Date: Sun, 17 Nov 2019 11:41:20 GMT
Expires: -1
Cache-Control: private, max-age=0
Content-Type: text/html; charset=ISO-8859-1
Server: gws
X-XSS-Protection: 0
X-Frame-Options: SAMEORIGIN
Accept-Ranges: none
Vary: Accept-Encoding
<!doctype html><html itemscope=“”
itemtype=“http://schema.org/WebPage” lang=“ja”><head>・・・
#jjug_ccc #ccc_i3
Javaでネットワークプログラミング
• HTTPクライアント(ブラウザ)を実装する
• HTTPのレスポンスを受信する
HTTP/1.0 200 OK
Date: Sun, 17 Nov 2019 11:41:20 GMT
Expires: -1
Cache-Control: private, max-age=0
Content-Type: text/html; charset=ISO-8859-1
Server: gws
X-XSS-Protection: 0
X-Frame-Options: SAMEORIGIN
Accept-Ranges: none
Vary: Accept-Encoding
<!doctype html><html itemscope=“”
itemtype=“http://schema.org/WebPage” lang=“ja”><head>・・・
空行より前が
レスポンスヘッダー
#jjug_ccc #ccc_i3
Javaでネットワークプログラミング
• HTTPクライアント(ブラウザ)を実装する
• HTTPのレスポンスを受信する
HTTP/1.0 200 OK
Date: Sun, 17 Nov 2019 11:41:20 GMT
Expires: -1
Cache-Control: private, max-age=0
Content-Type: text/html; charset=ISO-8859-1
Server: gws
X-XSS-Protection: 0
X-Frame-Options: SAMEORIGIN
Accept-Ranges: none
Vary: Accept-Encoding
<!doctype html><html itemscope=“”
itemtype=“http://schema.org/WebPage” lang=“ja”><head>・・・
空行以降が
レスポンスボディー
#jjug_ccc #ccc_i3
Javaでネットワークプログラミング
• HTTPサーバーを実装する
• HTTPクライアント(ブラウザ)からの要求に応える
• TCPの接続を受け取る(サーバーになる)方法を学ぶ
• データを受信する(リクエストを受け取る)方法を学ぶ
• データを送信する(レスポンスを送る)方法を学ぶ
#jjug_ccc #ccc_i3
Javaでネットワークプログラミング
• HTTPサーバーを実装する
• HTTPクライアント(ブラウザ)からの要求に応える
• TCPの接続を受け取る(サーバーになる)方法を学ぶ
• データを受信する(リクエストを受け取る)方法を学ぶ
• データを送信する(レスポンスを送る)方法を学ぶ
#jjug_ccc #ccc_i3
Javaでネットワークプログラミング
• HTTPサーバーを実装する
• TCPの接続を受け取る
ServerSocket serverSocket = new ServerSocket( 80 );
Socket socket = serverSocket.accept();
#jjug_ccc #ccc_i3
Javaでネットワークプログラミング
• HTTPサーバーを実装する
• TCPの接続を受け取る
受け付けるポート番号を指定
(HTTPのウェルノウンポート80番)
ServerSocket serverSocket = new ServerSocket( 80 );
Socket socket = serverSocket.accept();
#jjug_ccc #ccc_i3
Javaでネットワークプログラミング
• HTTPサーバーを実装する
• TCPの接続を受け取る
acceptメソッドでリッスン状態(待機状態)にする
ServerSocket serverSocket = new ServerSocket( 80 );
Socket socket = serverSocket.accept();
#jjug_ccc #ccc_i3
Javaでネットワークプログラミング
• HTTPサーバーを実装する
• TCPの接続を受け取る
> netstat -nao
アクティブな接続
プロトコル ローカル アドレス 外部アドレス 状態 PID
TCP 0.0.0.0:80 0.0.0.0:0 LISTENING 13432
ServerSocket serverSocket = new ServerSocket( 80 );
Socket socket = serverSocket.accept();
acceptメソッドでリッスン状態(待機状態)にする
#jjug_ccc #ccc_i3
Javaでネットワークプログラミング
• HTTPサーバーを実装する
• TCPの接続を受け取る
ServerSocket serverSocket = new ServerSocket( 80 );
Socket socket = serverSocket.accept();
#jjug_ccc #ccc_i3
Javaでネットワークプログラミング
• HTTPサーバーを実装する
• TCPの接続を受け取る
ServerSocket serverSocket = new ServerSocket( 80 );
Socket socket = serverSocket.accept();
Enter!
#jjug_ccc #ccc_i3
Javaでネットワークプログラミング
• HTTPサーバーを実装する
• HTTPクライアント(ブラウザ)からの要求に応える
• TCPの接続を受け取る(サーバーになる)方法を学ぶ
• データを受信する(リクエストを受け取る)方法を学ぶ
• データを送信する(レスポンスを送る)方法を学ぶ
#jjug_ccc #ccc_i3
Javaでネットワークプログラミング
• HTTPサーバーを実装する
• HTTPのリクエストを受信する
InputStream in = socket.getInputStream( );
int data;
while (( data=in.read()) != -1 ) {
System.out.write( data );
}
#jjug_ccc #ccc_i3
Javaでネットワークプログラミング
• HTTPサーバーを実装する
• HTTPクライアント(ブラウザ)からの要求に応える
• TCPの接続を受け取る(サーバーになる)方法を学ぶ
• データを受信する(リクエストを受け取る)方法を学ぶ
• データを送信する(レスポンスを送る)方法を学ぶ
#jjug_ccc #ccc_i3
Javaでネットワークプログラミング
• HTTPサーバーを実装する
• HTTPのレスポンスを作成する
StringBuilder response = new StringBuilder();
response.append( "HTTP/1.0 200 OK” ).append( “rn” );
response.append( "rn“ );
response.append( "<html><body>“ ).append( “rn” );
response.append( "<h1>hello world.</h1>“ ).append( “rn” );
response.append( "</body></html>“ );
HTTP/1.0 200 OK ⏎
⏎
<html><body> ⏎
<h1>hello world.</h1> ⏎
</body></html>
#jjug_ccc #ccc_i3
Javaでネットワークプログラミング
• HTTPサーバーを実装する
• HTTPのレスポンスを送信する
OutputStream out = socket.getOutputStream( );
out.write( response.toString().getBytes() );
#jjug_ccc #ccc_i3
Javaでネットワークプログラミング
• HTTPサーバーを実装する
• HTTPのレスポンスを送信する
#jjug_ccc #ccc_i3
Javaでネットワークプログラミング
• Socketでクライアントを実装
• ServerSocketでサーバーを実装
#jjug_ccc #ccc_i3
Javaでネットワークプログラミング
• 特殊なHTTPサーバー → プロキシサーバー
• イントラネットとインターネットの間に置くサーバー
• アプリケーション層で動作 (ルーターはインターネット層)
• アクセス制限・ログ収集などセキュリティ的な理由で配置
• イントラネットからのリクエストを代理する
• コンテンツをキャッシュして高速ブラウジング
#jjug_ccc #ccc_i3
Javaでネットワークプログラミング
• プロキシサーバー
インターネット
イントラネット プロキシ
サーバー
#jjug_ccc #ccc_i3
Javaでネットワークプログラミング
• ブラウザのプロキシサーバー設定
• Chromeの場合、設定 → システム
#jjug_ccc #ccc_i3
Javaでネットワークプログラミング
• ブラウザのプロキシサーバー設定
• OSのプロキシ設定
#jjug_ccc #ccc_i3
Javaでネットワークプログラミング
• ブラウザのプロキシサーバー設定
• OSのプロキシ設定
#jjug_ccc #ccc_i3
Javaでネットワークプログラミング
• HTTPサーバーを起動してブラウザからリクエスト
• リクエスト内容
GET http://www.yahoo.co.jp/ HTTP/1.1
Host: www.yahoo.co.jp
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: ja,en-US;q=0.7,en;q=0.3
Accept-Encoding: gzip, deflate
Connection: keep-alive
Upgrade-Insecure-Requests: 1
Cache-Control: max-age=0
#jjug_ccc #ccc_i3
Javaでネットワークプログラミング
• HTTPサーバーを起動してブラウザからリクエスト
• リクエスト内容
GET http://www.yahoo.co.jp/ HTTP/1.1
Host: www.yahoo.co.jp
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: ja,en-US;q=0.7,en;q=0.3
Accept-Encoding: gzip, deflate
Connection: keep-alive
Upgrade-Insecure-Requests: 1
Cache-Control: max-age=0
接続先のプロトコルとホストを記載
GET / HTTP/1.1
#jjug_ccc #ccc_i3
Javaでネットワークプログラミング
• HTTPサーバーを起動してブラウザからリクエスト
• リクエスト内容
GET http://www.yahoo.co.jp/ HTTP/1.1
Host: www.yahoo.co.jp
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: ja,en-US;q=0.7,en;q=0.3
Accept-Encoding: gzip, deflate
Connection: keep-alive
Upgrade-Insecure-Requests: 1
Cache-Control: max-age=0
先頭のメソッド行からプロトコルと
ホストを抽出して中継
#jjug_ccc #ccc_i3
Javaでネットワークプログラミング
• HTTPS (HTTP Secure)
• Webサーバーとブラウザ間で暗号化通信する仕組み
• SSL(Secure Socket Layer)プロトコルを使用
• 今はTLS(Transport Layer Security)プロトコルを使用
• 公開鍵暗号化方式で暗号化
• なりすましやデータ改ざんを検知する
• TCPで、ウェルノウンポートは443番
#jjug_ccc #ccc_i3
Javaでネットワークプログラミング
• 公開鍵暗号化方式
• 公開鍵と秘密鍵の2つの鍵を用いて暗号化する
• 公開鍵は公開OK、秘密鍵は公開NG
• クライアントはサーバーの公開鍵で暗号化
• サーバーは自身の秘密鍵で復号化
• サーバーの公開鍵を認証局でデジタル署名
#jjug_ccc #ccc_i3
Javaでネットワークプログラミング
• 公開鍵暗号化方式
サーバー
認証局
(CA)
ブラウザ
公開鍵 秘密鍵
第三者(認証局)に
公開鍵の本人性を
確認して署名してもらう
認証局の署名で
公開鍵が正規のもので
あることを確認
公開鍵で暗号化して送信
秘密鍵で
復号化
#jjug_ccc #ccc_i3
Javaでネットワークプログラミング
• HTTPSクライアント(ブラウザ)を実装する
• HTTPSのGETリクエストを送信する
URL url = new URL("https://www.google.co.jp/");
HttpsURLConnection ssl = (HttpsURLConnection) url.openConnection();
#jjug_ccc #ccc_i3
Javaでネットワークプログラミング
• HTTPSクライアント(ブラウザ)を実装する
• HTTPSのGETリクエストを送信する
URL url = new URL("https://www.google.co.jp/");
HttpsURLConnection ssl = (HttpsURLConnection) url.openConnection();
GET /⏎
⏎
#jjug_ccc #ccc_i3
Javaでネットワークプログラミング
• HTTPSサーバーを実装する
#jjug_ccc #ccc_i3
Javaでネットワークプログラミング
• HTTPSサーバーを実装する
• AWSに任せよう!
#jjug_ccc #ccc_i3
Javaでネットワークプログラミング
• HTTPSサーバーを実装する
• AWSに任せよう!
• ELB(ロードバランサー)を使って、HTTPSをHTTPに転送
• 無料のSSL証明書
• ELBとRoute53に設定して自動更新
#jjug_ccc #ccc_i3
まとめ
• インターネット プロトコル スイートの各階層の役割
• インターネット層 → IPアドレス
• トランスポート層 → TCP/UDP、ポート番号
• アプリケーション層 → HTTP・HTTPSなどのサービス
• 接続にはIPアドレス、ポート番号、TCP/UDPが必要
• 接続後はInput/OutputStreamで通信
• 言語が違っても上記の概念は一緒
• セキュリティ周りは自前で実装より既存のものを
#jjug_ccc #ccc_i3
Thank you for listening!

More Related Content

What's hot

AlloyDBを触ってみた!(第33回PostgreSQLアンカンファレンス@オンライン 発表資料)
AlloyDBを触ってみた!(第33回PostgreSQLアンカンファレンス@オンライン 発表資料)AlloyDBを触ってみた!(第33回PostgreSQLアンカンファレンス@オンライン 発表資料)
AlloyDBを触ってみた!(第33回PostgreSQLアンカンファレンス@オンライン 発表資料)NTT DATA Technology & Innovation
 
Prometheus at Preferred Networks
Prometheus at Preferred NetworksPrometheus at Preferred Networks
Prometheus at Preferred NetworksPreferred Networks
 
HBaseとRedisを使った100億超/日メッセージを処理するLINEのストレージ
HBaseとRedisを使った100億超/日メッセージを処理するLINEのストレージHBaseとRedisを使った100億超/日メッセージを処理するLINEのストレージ
HBaseとRedisを使った100億超/日メッセージを処理するLINEのストレージLINE Corporation
 
ビッグデータ処理データベースの全体像と使い分け
ビッグデータ処理データベースの全体像と使い分けビッグデータ処理データベースの全体像と使い分け
ビッグデータ処理データベースの全体像と使い分けRecruit Technologies
 
ぱぱっと理解するSpring Cloudの基本
ぱぱっと理解するSpring Cloudの基本ぱぱっと理解するSpring Cloudの基本
ぱぱっと理解するSpring Cloudの基本kazuki kumagai
 
Cloud runのオートスケールを検証してみる
Cloud runのオートスケールを検証してみるCloud runのオートスケールを検証してみる
Cloud runのオートスケールを検証してみる虎の穴 開発室
 
PHPからgoへの移行で分かったこと
PHPからgoへの移行で分かったことPHPからgoへの移行で分かったこと
PHPからgoへの移行で分かったことgree_tech
 
ドメイン駆動設計のための Spring の上手な使い方
ドメイン駆動設計のための Spring の上手な使い方ドメイン駆動設計のための Spring の上手な使い方
ドメイン駆動設計のための Spring の上手な使い方増田 亨
 
今こそ知りたいSpring Batch(Spring Fest 2020講演資料)
今こそ知りたいSpring Batch(Spring Fest 2020講演資料)今こそ知りたいSpring Batch(Spring Fest 2020講演資料)
今こそ知りたいSpring Batch(Spring Fest 2020講演資料)NTT DATA Technology & Innovation
 
Spring Boot ユーザの方のための Quarkus 入門
Spring Boot ユーザの方のための Quarkus 入門Spring Boot ユーザの方のための Quarkus 入門
Spring Boot ユーザの方のための Quarkus 入門tsukasamannen
 
続・PFN のオンプレML基盤の取り組み / オンプレML基盤 on Kubernetes 〜PFN、ヤフー〜 #2
続・PFN のオンプレML基盤の取り組み / オンプレML基盤 on Kubernetes 〜PFN、ヤフー〜 #2続・PFN のオンプレML基盤の取り組み / オンプレML基盤 on Kubernetes 〜PFN、ヤフー〜 #2
続・PFN のオンプレML基盤の取り組み / オンプレML基盤 on Kubernetes 〜PFN、ヤフー〜 #2Preferred Networks
 
開発速度が速い #とは(LayerX社内資料)
開発速度が速い #とは(LayerX社内資料)開発速度が速い #とは(LayerX社内資料)
開発速度が速い #とは(LayerX社内資料)mosa siru
 
pg_bigmで全文検索するときに気を付けたい5つのポイント(第23回PostgreSQLアンカンファレンス@オンライン 発表資料)
pg_bigmで全文検索するときに気を付けたい5つのポイント(第23回PostgreSQLアンカンファレンス@オンライン 発表資料)pg_bigmで全文検索するときに気を付けたい5つのポイント(第23回PostgreSQLアンカンファレンス@オンライン 発表資料)
pg_bigmで全文検索するときに気を付けたい5つのポイント(第23回PostgreSQLアンカンファレンス@オンライン 発表資料)NTT DATA Technology & Innovation
 
PFN のオンプレML基盤の取り組み / オンプレML基盤 on Kubernetes 〜PFN、ヤフー〜
PFN のオンプレML基盤の取り組み / オンプレML基盤 on Kubernetes 〜PFN、ヤフー〜PFN のオンプレML基盤の取り組み / オンプレML基盤 on Kubernetes 〜PFN、ヤフー〜
PFN のオンプレML基盤の取り組み / オンプレML基盤 on Kubernetes 〜PFN、ヤフー〜Preferred Networks
 
CDNの仕組み(JANOG36)
CDNの仕組み(JANOG36)CDNの仕組み(JANOG36)
CDNの仕組み(JANOG36)J-Stream Inc.
 
Azure API Management 俺的マニュアル
Azure API Management 俺的マニュアルAzure API Management 俺的マニュアル
Azure API Management 俺的マニュアル貴志 上坂
 
BuildKitによる高速でセキュアなイメージビルド
BuildKitによる高速でセキュアなイメージビルドBuildKitによる高速でセキュアなイメージビルド
BuildKitによる高速でセキュアなイメージビルドAkihiro Suda
 
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」SQLアンチパターン 幻の第26章「とりあえず削除フラグ」
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」Takuto Wada
 
大量のデータ処理や分析に使えるOSS Apache Spark入門(Open Source Conference 2021 Online/Kyoto 発表資料)
大量のデータ処理や分析に使えるOSS Apache Spark入門(Open Source Conference 2021 Online/Kyoto 発表資料)大量のデータ処理や分析に使えるOSS Apache Spark入門(Open Source Conference 2021 Online/Kyoto 発表資料)
大量のデータ処理や分析に使えるOSS Apache Spark入門(Open Source Conference 2021 Online/Kyoto 発表資料)NTT DATA Technology & Innovation
 

What's hot (20)

AlloyDBを触ってみた!(第33回PostgreSQLアンカンファレンス@オンライン 発表資料)
AlloyDBを触ってみた!(第33回PostgreSQLアンカンファレンス@オンライン 発表資料)AlloyDBを触ってみた!(第33回PostgreSQLアンカンファレンス@オンライン 発表資料)
AlloyDBを触ってみた!(第33回PostgreSQLアンカンファレンス@オンライン 発表資料)
 
Prometheus at Preferred Networks
Prometheus at Preferred NetworksPrometheus at Preferred Networks
Prometheus at Preferred Networks
 
HBaseとRedisを使った100億超/日メッセージを処理するLINEのストレージ
HBaseとRedisを使った100億超/日メッセージを処理するLINEのストレージHBaseとRedisを使った100億超/日メッセージを処理するLINEのストレージ
HBaseとRedisを使った100億超/日メッセージを処理するLINEのストレージ
 
ビッグデータ処理データベースの全体像と使い分け
ビッグデータ処理データベースの全体像と使い分けビッグデータ処理データベースの全体像と使い分け
ビッグデータ処理データベースの全体像と使い分け
 
ぱぱっと理解するSpring Cloudの基本
ぱぱっと理解するSpring Cloudの基本ぱぱっと理解するSpring Cloudの基本
ぱぱっと理解するSpring Cloudの基本
 
Cloud runのオートスケールを検証してみる
Cloud runのオートスケールを検証してみるCloud runのオートスケールを検証してみる
Cloud runのオートスケールを検証してみる
 
Docker Tokyo
Docker TokyoDocker Tokyo
Docker Tokyo
 
PHPからgoへの移行で分かったこと
PHPからgoへの移行で分かったことPHPからgoへの移行で分かったこと
PHPからgoへの移行で分かったこと
 
ドメイン駆動設計のための Spring の上手な使い方
ドメイン駆動設計のための Spring の上手な使い方ドメイン駆動設計のための Spring の上手な使い方
ドメイン駆動設計のための Spring の上手な使い方
 
今こそ知りたいSpring Batch(Spring Fest 2020講演資料)
今こそ知りたいSpring Batch(Spring Fest 2020講演資料)今こそ知りたいSpring Batch(Spring Fest 2020講演資料)
今こそ知りたいSpring Batch(Spring Fest 2020講演資料)
 
Spring Boot ユーザの方のための Quarkus 入門
Spring Boot ユーザの方のための Quarkus 入門Spring Boot ユーザの方のための Quarkus 入門
Spring Boot ユーザの方のための Quarkus 入門
 
続・PFN のオンプレML基盤の取り組み / オンプレML基盤 on Kubernetes 〜PFN、ヤフー〜 #2
続・PFN のオンプレML基盤の取り組み / オンプレML基盤 on Kubernetes 〜PFN、ヤフー〜 #2続・PFN のオンプレML基盤の取り組み / オンプレML基盤 on Kubernetes 〜PFN、ヤフー〜 #2
続・PFN のオンプレML基盤の取り組み / オンプレML基盤 on Kubernetes 〜PFN、ヤフー〜 #2
 
開発速度が速い #とは(LayerX社内資料)
開発速度が速い #とは(LayerX社内資料)開発速度が速い #とは(LayerX社内資料)
開発速度が速い #とは(LayerX社内資料)
 
pg_bigmで全文検索するときに気を付けたい5つのポイント(第23回PostgreSQLアンカンファレンス@オンライン 発表資料)
pg_bigmで全文検索するときに気を付けたい5つのポイント(第23回PostgreSQLアンカンファレンス@オンライン 発表資料)pg_bigmで全文検索するときに気を付けたい5つのポイント(第23回PostgreSQLアンカンファレンス@オンライン 発表資料)
pg_bigmで全文検索するときに気を付けたい5つのポイント(第23回PostgreSQLアンカンファレンス@オンライン 発表資料)
 
PFN のオンプレML基盤の取り組み / オンプレML基盤 on Kubernetes 〜PFN、ヤフー〜
PFN のオンプレML基盤の取り組み / オンプレML基盤 on Kubernetes 〜PFN、ヤフー〜PFN のオンプレML基盤の取り組み / オンプレML基盤 on Kubernetes 〜PFN、ヤフー〜
PFN のオンプレML基盤の取り組み / オンプレML基盤 on Kubernetes 〜PFN、ヤフー〜
 
CDNの仕組み(JANOG36)
CDNの仕組み(JANOG36)CDNの仕組み(JANOG36)
CDNの仕組み(JANOG36)
 
Azure API Management 俺的マニュアル
Azure API Management 俺的マニュアルAzure API Management 俺的マニュアル
Azure API Management 俺的マニュアル
 
BuildKitによる高速でセキュアなイメージビルド
BuildKitによる高速でセキュアなイメージビルドBuildKitによる高速でセキュアなイメージビルド
BuildKitによる高速でセキュアなイメージビルド
 
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」SQLアンチパターン 幻の第26章「とりあえず削除フラグ」
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」
 
大量のデータ処理や分析に使えるOSS Apache Spark入門(Open Source Conference 2021 Online/Kyoto 発表資料)
大量のデータ処理や分析に使えるOSS Apache Spark入門(Open Source Conference 2021 Online/Kyoto 発表資料)大量のデータ処理や分析に使えるOSS Apache Spark入門(Open Source Conference 2021 Online/Kyoto 発表資料)
大量のデータ処理や分析に使えるOSS Apache Spark入門(Open Source Conference 2021 Online/Kyoto 発表資料)
 

Similar to Javaで学ぶネットワークプログラミングの基礎

Mk vpp for-containers-vppug
Mk vpp for-containers-vppugMk vpp for-containers-vppug
Mk vpp for-containers-vppugMiya Kohno
 
45分で理解する ドッコムマスタートリプルスター受験対策 2012
45分で理解する ドッコムマスタートリプルスター受験対策 201245分で理解する ドッコムマスタートリプルスター受験対策 2012
45分で理解する ドッコムマスタートリプルスター受験対策 2012Yukio Saito
 
ゲームの通信をつくる仕事はどうなるのだろう?
ゲームの通信をつくる仕事はどうなるのだろう?ゲームの通信をつくる仕事はどうなるのだろう?
ゲームの通信をつくる仕事はどうなるのだろう?Kengo Nakajima
 
作って(壊して?)学ぶインターネットのしくみ サイバーエージェントの実験用ASの紹介 / Introduce experimental AS in ...
作って(壊して?)学ぶインターネットのしくみ サイバーエージェントの実験用ASの紹介 / Introduce experimental AS in ...作って(壊して?)学ぶインターネットのしくみ サイバーエージェントの実験用ASの紹介 / Introduce experimental AS in ...
作って(壊して?)学ぶインターネットのしくみ サイバーエージェントの実験用ASの紹介 / Introduce experimental AS in ...whywaita
 
SORACOM Conference Discovery 2017 | E3. デバイスからのクラウド連携パターン
SORACOM Conference Discovery 2017 | E3. デバイスからのクラウド連携パターンSORACOM Conference Discovery 2017 | E3. デバイスからのクラウド連携パターン
SORACOM Conference Discovery 2017 | E3. デバイスからのクラウド連携パターンSORACOM,INC
 
Node-redでプロトタイピング
Node-redでプロトタイピングNode-redでプロトタイピング
Node-redでプロトタイピングMakoto SAKAI
 
Network as a Service - Data plane evolution and abstraction by NSM
Network as a Service - Data plane evolution and abstraction by NSMNetwork as a Service - Data plane evolution and abstraction by NSM
Network as a Service - Data plane evolution and abstraction by NSMMiya Kohno
 
Soft layer network概要_jslug向け
Soft layer network概要_jslug向けSoft layer network概要_jslug向け
Soft layer network概要_jslug向けHideaki Tokida
 
インフラセキュリティブートキャンプ #seccamp
インフラセキュリティブートキャンプ #seccampインフラセキュリティブートキャンプ #seccamp
インフラセキュリティブートキャンプ #seccampMasahiro NAKAYAMA
 
次世代の企業ITインフラを支えるエンジニアとは
次世代の企業ITインフラを支えるエンジニアとは次世代の企業ITインフラを支えるエンジニアとは
次世代の企業ITインフラを支えるエンジニアとはTrainocate Japan, Ltd.
 
クラウドを活用したシステム開発における、ネットワークのInfrastructure as Code
クラウドを活用したシステム開発における、ネットワークのInfrastructure as Codeクラウドを活用したシステム開発における、ネットワークのInfrastructure as Code
クラウドを活用したシステム開発における、ネットワークのInfrastructure as Codeskipping classes
 
SORACOM Conference "Discovery" 2018 | F3. SORACOMで実現する “Intranet” Of Things バ...
SORACOM Conference "Discovery" 2018 | F3. SORACOMで実現する “Intranet” Of Things バ...SORACOM Conference "Discovery" 2018 | F3. SORACOMで実現する “Intranet” Of Things バ...
SORACOM Conference "Discovery" 2018 | F3. SORACOMで実現する “Intranet” Of Things バ...SORACOM,INC
 
高速ネットワーク技術と周辺動向(特別講義)
高速ネットワーク技術と周辺動向(特別講義)高速ネットワーク技術と周辺動向(特別講義)
高速ネットワーク技術と周辺動向(特別講義)Naoto MATSUMOTO
 
オープンソースのIoT向けスケールアウト型データベース GridDB 〜性能ベンチマーク結果とOSSを利用したビッグデータ分析環境〜
オープンソースのIoT向けスケールアウト型データベース GridDB 〜性能ベンチマーク結果とOSSを利用したビッグデータ分析環境〜オープンソースのIoT向けスケールアウト型データベース GridDB 〜性能ベンチマーク結果とOSSを利用したビッグデータ分析環境〜
オープンソースのIoT向けスケールアウト型データベース GridDB 〜性能ベンチマーク結果とOSSを利用したビッグデータ分析環境〜griddb
 
Bluetooth Low Energy入門講座 -part2
Bluetooth Low Energy入門講座 -part2Bluetooth Low Energy入門講座 -part2
Bluetooth Low Energy入門講座 -part2edy555
 
データセンターネットワークの構成について
データセンターネットワークの構成についてデータセンターネットワークの構成について
データセンターネットワークの構成についてMicroAd, Inc.(Engineer)
 
サーバを仮想化したのにネットワークはこれまで通りでいい?←いや、いや、そんなわけないでしょ
サーバを仮想化したのにネットワークはこれまで通りでいい?←いや、いや、そんなわけないでしょサーバを仮想化したのにネットワークはこれまで通りでいい?←いや、いや、そんなわけないでしょ
サーバを仮想化したのにネットワークはこれまで通りでいい?←いや、いや、そんなわけないでしょBrocade
 
【Connected.T5】SORACOMと繋がるクラウドサービス
【Connected.T5】SORACOMと繋がるクラウドサービス【Connected.T5】SORACOMと繋がるクラウドサービス
【Connected.T5】SORACOMと繋がるクラウドサービスSORACOM,INC
 
JAWS目黒 EC2チューニングTips #jawsmeguro #jawsug
JAWS目黒 EC2チューニングTips #jawsmeguro #jawsugJAWS目黒 EC2チューニングTips #jawsmeguro #jawsug
JAWS目黒 EC2チューニングTips #jawsmeguro #jawsugYasuhiro Matsuo
 

Similar to Javaで学ぶネットワークプログラミングの基礎 (20)

Mk vpp for-containers-vppug
Mk vpp for-containers-vppugMk vpp for-containers-vppug
Mk vpp for-containers-vppug
 
45分で理解する ドッコムマスタートリプルスター受験対策 2012
45分で理解する ドッコムマスタートリプルスター受験対策 201245分で理解する ドッコムマスタートリプルスター受験対策 2012
45分で理解する ドッコムマスタートリプルスター受験対策 2012
 
ゲームの通信をつくる仕事はどうなるのだろう?
ゲームの通信をつくる仕事はどうなるのだろう?ゲームの通信をつくる仕事はどうなるのだろう?
ゲームの通信をつくる仕事はどうなるのだろう?
 
作って(壊して?)学ぶインターネットのしくみ サイバーエージェントの実験用ASの紹介 / Introduce experimental AS in ...
作って(壊して?)学ぶインターネットのしくみ サイバーエージェントの実験用ASの紹介 / Introduce experimental AS in ...作って(壊して?)学ぶインターネットのしくみ サイバーエージェントの実験用ASの紹介 / Introduce experimental AS in ...
作って(壊して?)学ぶインターネットのしくみ サイバーエージェントの実験用ASの紹介 / Introduce experimental AS in ...
 
SORACOM Conference Discovery 2017 | E3. デバイスからのクラウド連携パターン
SORACOM Conference Discovery 2017 | E3. デバイスからのクラウド連携パターンSORACOM Conference Discovery 2017 | E3. デバイスからのクラウド連携パターン
SORACOM Conference Discovery 2017 | E3. デバイスからのクラウド連携パターン
 
Node-redでプロトタイピング
Node-redでプロトタイピングNode-redでプロトタイピング
Node-redでプロトタイピング
 
Network as a Service - Data plane evolution and abstraction by NSM
Network as a Service - Data plane evolution and abstraction by NSMNetwork as a Service - Data plane evolution and abstraction by NSM
Network as a Service - Data plane evolution and abstraction by NSM
 
Soft layer network概要_jslug向け
Soft layer network概要_jslug向けSoft layer network概要_jslug向け
Soft layer network概要_jslug向け
 
インフラセキュリティブートキャンプ #seccamp
インフラセキュリティブートキャンプ #seccampインフラセキュリティブートキャンプ #seccamp
インフラセキュリティブートキャンプ #seccamp
 
次世代の企業ITインフラを支えるエンジニアとは
次世代の企業ITインフラを支えるエンジニアとは次世代の企業ITインフラを支えるエンジニアとは
次世代の企業ITインフラを支えるエンジニアとは
 
クラウドを活用したシステム開発における、ネットワークのInfrastructure as Code
クラウドを活用したシステム開発における、ネットワークのInfrastructure as Codeクラウドを活用したシステム開発における、ネットワークのInfrastructure as Code
クラウドを活用したシステム開発における、ネットワークのInfrastructure as Code
 
SORACOM Conference "Discovery" 2018 | F3. SORACOMで実現する “Intranet” Of Things バ...
SORACOM Conference "Discovery" 2018 | F3. SORACOMで実現する “Intranet” Of Things バ...SORACOM Conference "Discovery" 2018 | F3. SORACOMで実現する “Intranet” Of Things バ...
SORACOM Conference "Discovery" 2018 | F3. SORACOMで実現する “Intranet” Of Things バ...
 
高速ネットワーク技術と周辺動向(特別講義)
高速ネットワーク技術と周辺動向(特別講義)高速ネットワーク技術と周辺動向(特別講義)
高速ネットワーク技術と周辺動向(特別講義)
 
オープンソースのIoT向けスケールアウト型データベース GridDB 〜性能ベンチマーク結果とOSSを利用したビッグデータ分析環境〜
オープンソースのIoT向けスケールアウト型データベース GridDB 〜性能ベンチマーク結果とOSSを利用したビッグデータ分析環境〜オープンソースのIoT向けスケールアウト型データベース GridDB 〜性能ベンチマーク結果とOSSを利用したビッグデータ分析環境〜
オープンソースのIoT向けスケールアウト型データベース GridDB 〜性能ベンチマーク結果とOSSを利用したビッグデータ分析環境〜
 
Bluetooth Low Energy入門講座 -part2
Bluetooth Low Energy入門講座 -part2Bluetooth Low Energy入門講座 -part2
Bluetooth Low Energy入門講座 -part2
 
データセンターネットワークの構成について
データセンターネットワークの構成についてデータセンターネットワークの構成について
データセンターネットワークの構成について
 
サーバを仮想化したのにネットワークはこれまで通りでいい?←いや、いや、そんなわけないでしょ
サーバを仮想化したのにネットワークはこれまで通りでいい?←いや、いや、そんなわけないでしょサーバを仮想化したのにネットワークはこれまで通りでいい?←いや、いや、そんなわけないでしょ
サーバを仮想化したのにネットワークはこれまで通りでいい?←いや、いや、そんなわけないでしょ
 
【Connected.T5】SORACOMと繋がるクラウドサービス
【Connected.T5】SORACOMと繋がるクラウドサービス【Connected.T5】SORACOMと繋がるクラウドサービス
【Connected.T5】SORACOMと繋がるクラウドサービス
 
20201127 .NET 5
20201127 .NET 520201127 .NET 5
20201127 .NET 5
 
JAWS目黒 EC2チューニングTips #jawsmeguro #jawsug
JAWS目黒 EC2チューニングTips #jawsmeguro #jawsugJAWS目黒 EC2チューニングTips #jawsmeguro #jawsug
JAWS目黒 EC2チューニングTips #jawsmeguro #jawsug
 

More from なべ

Reladomoを使ったトランザクション履歴管理をプロダクトに適用した際のメリット/デメリット/課題など
Reladomoを使ったトランザクション履歴管理をプロダクトに適用した際のメリット/デメリット/課題などReladomoを使ったトランザクション履歴管理をプロダクトに適用した際のメリット/デメリット/課題など
Reladomoを使ったトランザクション履歴管理をプロダクトに適用した際のメリット/デメリット/課題などなべ
 
普通のJavaエンジニアが、なぜ技術書を出版するに至ったか?
普通のJavaエンジニアが、なぜ技術書を出版するに至ったか?普通のJavaエンジニアが、なぜ技術書を出版するに至ったか?
普通のJavaエンジニアが、なぜ技術書を出版するに至ったか?なべ
 
Spring bootでweb セキュリティ(ログイン認証)編
Spring bootでweb セキュリティ(ログイン認証)編Spring bootでweb セキュリティ(ログイン認証)編
Spring bootでweb セキュリティ(ログイン認証)編なべ
 
Spring bootでweb バリデート編
Spring bootでweb バリデート編Spring bootでweb バリデート編
Spring bootでweb バリデート編なべ
 
Spring bootでweb ユニットテスト編
Spring bootでweb ユニットテスト編Spring bootでweb ユニットテスト編
Spring bootでweb ユニットテスト編なべ
 
Spring bootでweb 基本編
Spring bootでweb 基本編Spring bootでweb 基本編
Spring bootでweb 基本編なべ
 
Lombokのススメ
LombokのススメLombokのススメ
Lombokのススメなべ
 
はじめてのSpring Boot
はじめてのSpring BootはじめてのSpring Boot
はじめてのSpring Bootなべ
 

More from なべ (8)

Reladomoを使ったトランザクション履歴管理をプロダクトに適用した際のメリット/デメリット/課題など
Reladomoを使ったトランザクション履歴管理をプロダクトに適用した際のメリット/デメリット/課題などReladomoを使ったトランザクション履歴管理をプロダクトに適用した際のメリット/デメリット/課題など
Reladomoを使ったトランザクション履歴管理をプロダクトに適用した際のメリット/デメリット/課題など
 
普通のJavaエンジニアが、なぜ技術書を出版するに至ったか?
普通のJavaエンジニアが、なぜ技術書を出版するに至ったか?普通のJavaエンジニアが、なぜ技術書を出版するに至ったか?
普通のJavaエンジニアが、なぜ技術書を出版するに至ったか?
 
Spring bootでweb セキュリティ(ログイン認証)編
Spring bootでweb セキュリティ(ログイン認証)編Spring bootでweb セキュリティ(ログイン認証)編
Spring bootでweb セキュリティ(ログイン認証)編
 
Spring bootでweb バリデート編
Spring bootでweb バリデート編Spring bootでweb バリデート編
Spring bootでweb バリデート編
 
Spring bootでweb ユニットテスト編
Spring bootでweb ユニットテスト編Spring bootでweb ユニットテスト編
Spring bootでweb ユニットテスト編
 
Spring bootでweb 基本編
Spring bootでweb 基本編Spring bootでweb 基本編
Spring bootでweb 基本編
 
Lombokのススメ
LombokのススメLombokのススメ
Lombokのススメ
 
はじめてのSpring Boot
はじめてのSpring BootはじめてのSpring Boot
はじめてのSpring Boot
 

Javaで学ぶネットワークプログラミングの基礎